在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
公平地说,可以调用本机代码,在那里你可以得到本地字节有序的东西。