найти порядковый номер системы в Java - PullRequest
11 голосов
/ 24 февраля 2012

Я обнаружил, что алгоритм (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.

Ответы [ 6 ]

33 голосов
/ 24 февраля 2012

Я не беру кредит на это, однако вы можете попробовать:

import java.nio.ByteOrder;

if (ByteOrder.nativeOrder().equals(ByteOrder.BIG_ENDIAN)) {
  System.out.println("Big-endian");
} else {
  System.out.println("Little-endian");
}
3 голосов
/ 24 февраля 2012

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

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

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

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

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

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

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

1 голос
/ 12 ноября 2016
System.out.println(ByteOrder.nativeOrder());
1 голос
/ 04 апреля 2014

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

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

0 голосов
/ 24 февраля 2012

JVM, а следовательно, и Java, строго с прямым порядком байтов независимо от платформы хоста.

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

Вот код для вас:

boolean is_big_endian()
{
    return true;
}

Edit:

См. Этот ответ со ссылками: Порядковый номер виртуальной машины Java

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...