在java中找到系统的字节顺序

如果机器是bigindian或littleindian,我发现checkink算法(int C)

int is_big_endian(void) { union { uint32_t i; char c[4]; } bint = {0x01020304}; return bint.c[0] == 1; } 

我怎样才能在* java中找到这样的东西 *我不想使用内置的库,因为这是一个采访问题。我想在java中找到它。

我不相信,但你可以尝试:

 import java.nio.ByteOrder; if (ByteOrder.nativeOrder().equals(ByteOrder.BIG_ENDIAN)) { System.out.println("Big-endian"); } else { System.out.println("Little-endian"); } 

我怎么能在* java中找到这样的东西?*我不想使用内置的libs,因为这是一个面试问题。我想在java中找到它。

如果不调用库,则无法在纯Java中执行此操作。 这是因为;

  • Java说你不应该关心这些事情,如果你能避免的话。
  • Java作为一种语言相对较差,并且依赖于它的库来执行许多可能是另一种语言的语言function的东西。
  • 大多数人不区分语言的作用和内置库的内容,因为区别很少有用。
  • 字节码/虚拟机本身不是大端或小端,只有实际的实现。 ;)

较旧的库仅支持大端(大多数处理器使用,英特尔是一个值得注意的例外)较新的库可以设置为一种或另一种。

您很少需要知道如何重新编写内置function,如果您这样做,您将阅读有关如何完成它的代码(即使您确实知道如何完成)

我已经看到很多人重新开发内置function,这些function有缺陷,更难以使用,因为它的行为方式比意想不到,而且内置库的性能也不如预期。 很有可能写一些比JDK更快或更定制的东西,但知道如何离开头顶很少有用。

我不时会得到这些问题,在回答问题之前,我指出了你不会这样做的所有原因。 ;)

在具有sun.misc.Unsafe类并在名为“theUnsafe”的静态实例变量中存储不安全单例的JVM上,可以使用以下方法。 我在Oracle JVM和openjdk上成功测试了这个。 该代码的工作原理是将短(2字节)值1写入内存,然后读取第一个字节。

 import java.lang.reflect.Field; import sun.misc.Unsafe; public class Endianness { private static Unsafe getUnsafe() { Unsafe unsafe = null; try { Field f = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); f.setAccessible(true); unsafe = (Unsafe) f.get(null); } catch (Exception e) {} return unsafe; } public static void main(String[] args) { Unsafe unsafe = getUnsafe(); long address = unsafe.allocateMemory(2); short number = 1; unsafe.putShort(address, number); if (unsafe.getByte(address) == 0) System.out.println("Big Endian"); else System.out.println("Little Endian"); unsafe.freeMemory(address); } } 
 System.out.println(ByteOrder.nativeOrder()); 
 public static void getEndian(){ int a = 0; // 0x0....01 int b = 1; //0x0..0,0.01,0..0,0..0 int combine = (b<<16) | a; System.out.println(combine); if(combine == 65536){ System.out.println("LittleEndian"); }else{ System.out.println("BigEndian"); } } 

我的方法只是改变数字,并比较它是否作为对小端机制的期望

无论主机平台如何,JVM和Java都是严格的大端。

但是,在关系字符编码中,可以提取有关系统默认编码的信息,该信息可能具有字节序(实际上很可能)。

这里有一些代码给你:

 boolean is_big_endian() { return true; } 

编辑:

请参阅此答案以及参考: Java的虚拟机的Endianness

公平地说,可以调用本机代码,在那里你可以得到本地字节有序的东西。