有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

jvm在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中找到这样的东西*我不想使用内置LIB,因为这是一个面试问题。我想在java中找到它


共 (5) 个答案

  1. # 1 楼答案

    JVM,也就是Java,严格地说是big-endian,而不管主机平台是什么

    然而,在关联字符编码中,可以提取有关系统默认编码的信息,该编码可能具有尾端性(事实上,它很可能具有尾端性)

    以下是一些代码:

    boolean is_big_endian()
    {
        return true;
    }
    

    编辑:

    请参考以下答案:Java's Virtual Machine's Endianness

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

  2. # 2 楼答案

    在有太阳的JVM上。杂项。不安全的类,并将不安全的单例存储在名为“theUnsafe”的静态实例变量中,然后可以使用以下方法。我在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);
        }
    }
    
  3. # 3 楼答案

    System.out.println(ByteOrder.nativeOrder());
    
  4. # 4 楼答案

    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");
        }
    }
    

    我的方法只是改变数字,比较它是否能作为little endian机制的预期

  5. # 5 楼答案

    我不相信这一点,不过你可以试试:

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