Разница между C# и байтами Java с прямым порядком байтов при использовании miscutil
Я использую библиотеку 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 ответ
Это связано с тем, что байты в Java (JVM) подписаны, а в C# - нет. Это не имеет ничего общего с представлением с прямым или обратным порядком байтов.
Другими словами, байты Java варьируются от -128 - 127
и C# байты варьируются от 0 - 255
,
Таким образом, при попытке представить байт выше 127
в Java вы переполняете и переходите к -120
,
byte: тип данных байта представляет собой 8-разрядное целое число со знаком в виде двоичного числа со знаком. Он имеет минимальное значение -128 и максимальное значение 127 (включительно). Байтовый тип данных может быть полезен для сохранения памяти в больших массивах, где экономия памяти действительно имеет значение. Их также можно использовать вместо int, где их пределы помогают уточнить ваш код; тот факт, что диапазон переменной ограничен, может служить формой документации.
Из MSDN:
Тип значения Byte представляет целые числа без знака со значениями от 0 до 255.