2010-04-08 3 views
2

소켓을 사용하여 Java와 C# 응용 프로그램 사이에서 통신하기 위해 miscutil 라이브러리를 사용하고 있습니다. 나는 다음과 같은 코드의 차이를 알아 내려고 노력하고 있어요 (이 멋져요하지만 자바 결과는 동일) :차이점은 C#과 miscutil을 사용하는 빅 엔디안 바이트

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 */ 

당신이 볼 수 있듯이, 마지막 바이트는 Java 버전에서는 -120이고 C#에서는 136입니다.

답변

8

이것은 Java (JVM)의 바이트가 서명되고 C#에서 바이트가 서명되지 않는다는 사실과 관련이 있습니다. 크고 작은 엔디안 표현과는 아무런 관련이 없습니다.

즉, Java의 바이트 범위는 -128 - 127이고 C# 바이트 범위는 0 - 255입니다.

따라서 Java에서 127 이상의 바이트를 나타내려고하면 오버 플로우되어 -120으로 바뀝니다. Java tutorials에서

:

바이트 : 바이트의 데이터 타입이 8 비트는 2의 보수 부호있는 정수입니다. 최소값은 -128이고 최대 값은 127 (포함)입니다. 바이트 데이터 형식은 메모리 절약이 실제로 중요한 경우 큰 배열에 메모리를 절약하는 데 유용 할 수 있습니다. 또한 int 대신에 제한을 사용하여 코드를 명확히 할 수 있습니다. 변수의 범위가 제한된다는 사실은 문서화의 한 형태가 될 수 있습니다. 에서

MSDN :

바이트 값 유형이 0에서 255

+0

내가 sbyte에 대한 BitConverter이 필요하거나 존의 클래스를 사용하는 것 같다 및 범위의 값을 가진 부호없는 정수를 나타냅니다 생성 된 byte [] 배열을 sbyte [] 배열로 변환합니다. –

+0

네, 어떻게 든 C#에서'sbyte'를 사용하면'byte' int 자바와 같은 성능을 낼 것입니다. – jjnguy

관련 문제