Разница между C # и байтами Java с прямым порядком байтов при использовании miscutil - PullRequest
2 голосов
/ 08 апреля 2010

Я использую библиотеку miscutil для связи между приложением 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 #.

1 Ответ

8 голосов
/ 08 апреля 2010

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

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

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

Из учебников по Java :

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

Из MSDN :

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

...