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#.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top