Кодирование целого числа в строку байтов - PullRequest
0 голосов
/ 25 марта 2020

Я сталкивался с этим способом кодирования целого числа в байтах. Строка

  public String intToString(int x) {
    char[] bytes = new char[4];
    for(int i = 3; i > -1; --i) {
      bytes[3 - i] = (char) (x >> (i * 8) & 0xff);
    }
    return new String(bytes);
  }

Я не совсем понял, почему мы выполняем итерацию в этом порядке

(x >> (24) & 0xff);  //stored in bytes[0]
(x >> (16) & 0xff);  //stored in bytes[1]
(x >> (8) & 0xff);   //stored in bytes[2]
(x >> (0) & 0xff);   //stored in bytes[3]

, а не наоборот round

Используется для декодирования

  public int stringToInt(String bytesStr) {
    int result = 0;
    for(char b : bytesStr.toCharArray()) {
      result = (result << 8) + (int)b;
    }
    return result;
  }

Я знаю, что & 0xff используется для маскировки и сбора 8 битов за раз. Я просто не знаю, почему это в таком порядке? Кто-нибудь может объяснить? Спасибо.

1 Ответ

1 голос
/ 25 марта 2020

Вы можете использовать любой заказ, который хотите. Порядок следования байтов в номере компьютера называется порядком байтов https://en.wikipedia.org/wiki/Endianness

То, что вы видите здесь, имеет самый старший байт и называется "старшим порядком байтов". Он используется во многих сетевых протоколах и форматах файлов. Обратный порядок называется «прямым порядком байтов», и в настоящее время он является собственным порядком байтов на большинстве машин (x86 и большинство ручных процессоров). В зависимости от того, что вы делаете, один заказ может быть более удобным, чем другой.

...