Разница между C # и Java Big Endian Bytes с использованием MiscUtil

StackOverflow https://stackoverflow.com/questions/2597715

Вопрос

Я использую выступ Библиотека для связи между приложением между Java и C # с использованием сокета. Я пытаюсь выяснить разницу между следующим кодом (это Groovy, но результат Java такой же):

import java.io.*

def baos = new ByteArrayOutputStream();
def stream = new DataOutputStream(baos);
stream.writeInt(5000)

baos.toByteArray().each { println it }

/* outputs - 0, 0, 19, -120 */

и C #:

using (var ms = new MemoryStream())
using (EndianBinaryWriter writer = new EndianBinaryWriter(EndianBitConverter.Big, ms, Encoding.UTF8))
{
  writer.Write(5000);
  ms.Position = 0;
  foreach (byte bb in ms.ToArray())
  {
    Console.WriteLine(bb);
  }
}

/* outputs - 0, 0, 19, 136 */

Как вы можете видеть, последний байт -120 в версии Java и 136 в C #.

Это было полезно?

Решение

Это связано с тем, что байты в Java (JVM) подписываются, а в C # они нет. Это не имеет ничего общего с большим или маленьким рецентом.

Другими словами, байты Java варьируются от -128 - 127, и C # байты варьируются от 0 - 255.

Таким образом, при попытке представлять байт выше 127 в Яве, вы переполняете и обернитесь к -120.

Из Учебники Java:

байт: Тип данных байтов является 8-битным подписанным целым числовым числом. Это имеет минимальное значение -128 и максимальное значение 127 (включено). Тип данных байтов может быть полезен для сохранения памяти в больших массивах, где экономия памяти на самом деле имеет значение. Они также могут быть использованы вместо INT, где их ограничения помогают уточнить ваш код; Тот факт, что диапазон переменных ограничен, может служить формой документации.

Из MSDN:

Тип байтового значения представляет целые числа unsigned с значениями от 0 до 255.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top