Найти сущность системы в java

Я выяснил, что алгоритм (int C) для checkink, если машина является bigindian или littleindian, является

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

    return bint.c[0] == 1; 
}

Как я могу найти такую ​​вещь в * java? * Я не хочу использовать встроенные библиотеки, так как это вопрос интервью. Я хочу узнать это в java.

Ответ 1

Я не беру на себя ответственность за это, но вы можете попробовать:

import java.nio.ByteOrder;

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

Ответ 2

Как я могу найти такую ​​вещь в * java? * Я не хочу использовать встроенные библиотеки, так как это вопрос интервью. Я хочу узнать это в java.

Вы не можете сделать это в чистой Java без вызова библиотеки. Это потому, что:

  • Java говорит, что вы не должны заботиться о таких вещах, если можете избежать этого.
  • Java относительно плохо работает как язык и полагается на свои библиотеки, чтобы делать много вещей, которые могут быть языковой функцией на другом языке.
  • Большинство людей не различают то, что делает язык, и что такое встроенная библиотека, потому что различие редко бывает полезным.
  • Байт-код/​​виртуальная машина не является большой энтикой или малой величиной как таковой, только реальные реализации.;)

Старые библиотеки поддерживают только большой endian (что большинство процессоров используют, Intel является заметным исключением). Более новые библиотеки могут быть установлены так или иначе.

Довольно редко вам нужно знать, как снова написать встроенную функциональность, и если бы вы это сделали, вы бы прочитали код о том, как это делается уже (даже если вы знали, как это можно сделать)

Я видел, как многие люди перестраивают встроенные функциональные возможности, которые являются сложными, более сложными в использовании, потому что они ведут себя непредсказуемыми и менее эффективными, чем встроенные библиотеки. Вполне возможно написать что-то более быстрое или более на заказ, чем то, что в JDK, но очень редко полезно знать, как с головы.

Я получаю эти вопросы время от времени, и прежде чем ответить на вопрос, я указываю все причины, по которым вы этого не сделаете.;)

Ответ 3

В JVM, которые имеют класс sun.misc.Unsafe и хранят Unsafe singleton в переменной статического экземпляра с именем "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);
    }
}

Ответ 4

System.out.println(ByteOrder.nativeOrder());

Ответ 5

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

Мой подход состоит в том, чтобы просто сдвинуть число и сравнить, работает ли он как ожидания для небольшого энтианского механизма.

Ответ 6

JVM и, следовательно, Java, строго big-endian, независимо от платформы хоста.

Однако, в отношении кодировок символов, можно извлечь информацию о кодировке по умолчанию системы, которая может иметь определенность (на самом деле, вероятно).

Вот вам какой-то код:

boolean is_big_endian()
{
    return true;
}

Edit:

См. этот ответ со ссылками: Консоль виртуальной машины Java

Справедливости ради, можно вызвать в собственный код, и там вы можете получить вещи, которые упорядочены по собственному байту.