我发现检查机器是大端还是小端的算法(int C)是
int is_big_endian(void)
{
union {
uint32_t i;
char c[4];
} bint = {0x01020304};
return bint.c[0] == 1;
}
我该如何在*Java中找到这种东西?因为这是一道面试题,我不想使用内置的库,我想在Java中自己找到它。
我发现检查机器是大端还是小端的算法(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");
}
int
作为键,并且为该键使用多个值并回收所有节点。当然,我从 TreeMap 中复制了很多好的代码,并尽可能保持名称相同。 - Peter LawreySystem.out.println(ByteOrder.nativeOrder());
对于有 sun.misc.Unsafe 类,并在静态实例变量中存储 Unsafe 单例的 JVM,可以使用以下方法。我在 Oracle JVM 和 openjdk 上成功测试了此代码。该代码的工作原理是将一个短的(2 字节)值写入内存,然后读取第一个字节。
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);
}
}
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虚拟机的字节序
公平地说,可以调用本地代码,在那里你可以获得本地字节顺序的内容。
bitmap.copyPixelsToBuffer
)来进行实际的内存复制。这可能是我得到的缓冲区为什么是小端序的原因(它肯定是,因为它是一个每个颜色通道1字节的图像,我得到的是BGRA而不是ARGB)。我不确定JVM本身是否使用小端序,如果JVM规范明确说明,则可能不会。ByteOrder.nativeOrder()文档提到该常量存在是因为可以在本地运行性能敏感的代码。 - Peter Clark
union
的使用会触发未定义行为吗?我会改用将char const *
转换成uint32_t
。 - Fred Foo