Diferença entre C# e java bytes big-endian usando miscutil
-
25-09-2019 - |
Pergunta
Eu estou usando o miscutil biblioteca para comunicação entre o Java, o C# aplicativo usando um soquete.Eu estou tentando descobrir a diferença entre o código a seguir (este é Groovy, mas o Java resultado é o mesmo):
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 */
e 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 */
Como você pode ver, o último byte é -120
na versão de Java e 136
em C#.
Solução
Isso tem a ver com o facto de bytes em Java (JVM) são assinados, e em C#, eles não são.Não tem nada a ver com o big ou little endian representação.
Em outras palavras, Java bytes intervalo de -128 - 127
, e C# bytes intervalo de 0 - 255
.
Assim, ao tentar representar um byte acima 127
em Java, você estouro e enrole ao redor para -120
.
Do Java tutoriais:
byte: O tipo de dados byte é um 8-bit assinado complemento de dois inteiros.Ele tem um valor mínimo de -128 e um valor máximo de 127 (incluído).O tipo de dados byte pode ser útil para guardar a memória de grandes matrizes, onde a economia de memória realmente importa.Eles também podem ser usados no lugar de int, onde os seus limites, ajudar a clarificar o seu código;o fato de que uma variável do intervalo é limitado, pode servir como uma forma de documentação.
Do MSDN:
O valor de Byte de tipo representa números inteiros sem sinal com valores que variam de 0 a 255.