2016-10-12 7 views
1

현재 소켓 서버에서 작업 중입니다. 클라이언트가 BigEdian 형식으로 데이터를 전송하므로 this 패키지를 사용하기로 결정했습니다. 그러나 Int64의 경우 다른 값을 부여합니다.빅 엔디안 BinaryReader는 long 값을 읽을 때 잘못된 값을줍니다.

이것은 테스트 코드입니다. 그것은이 내 결과 8130168015229752764

나는 source code 들여다 그리고 이러한 기능을 발견했다 INT32

long val = ((long)868324021119164); 
byte[] longval = BitConverter.GetBytes((long)868324021119164); 
Array.Reverse(longval); 
using (MemoryStream stream = new MemoryStream(longval)) 
using (BeBinaryReader BeReader = new BeBinaryReader(stream)) 
{ 
    Console.WriteLine(BeReader.ReadInt64()); 
} 

을 위해 잘 작동합니다. 안전하지 않은 코드 사용 경험이 없습니다.

[MethodImpl(MethodImplOptions.AggressiveInlining)] 
public static long ReadInt64(byte* p) 
{ 
    int lo = ReadInt32(p); 
    int hi = ReadInt32(p + 4); 
    return (long)hi << 32 | (uint)lo; 
} 

잘 보이지 않습니다 그래서

public override long ReadInt64() 
{ 
    FillBuffer(8); 
    fixed (byte* p = buffer) 
     return BigEndian.ReadInt64(p); 
} 


[MethodImpl(MethodImplOptions.AggressiveInlining)] 
public static long ReadInt64(byte* p) 
{ 
    int lo = ReadInt32(p); 
    int hi = ReadInt32(p + 4); 
    return (long)hi << 32 | (uint)lo; 
} 

내가

답변

1

그 코드 여기에 10 64 비트 PC를

감사 창을 그들이 잘못 알고하지 않습니다 . 다음과 같아야합니다.

[MethodImpl(MethodImplOptions.AggressiveInlining)] 
public static long ReadInt64(byte* p) 
{ 
    int hi = ReadInt32(p); 
    int lo = ReadInt32(p + 4); 
    return (long)hi << 32 | (uint)lo; 
} 

빅 엔디안에서는 32 비트가 먼저옵니다. 코드가이를 반전시킵니다. 버그 보고서를 제출하고 저자에게 몇 가지 단위 테스트를 작성하도록 제안해야합니다.

+0

감사합니다. 버그가 이미 제출되었음을 알았습니다. 그러나 패키지에서 변경되지 않았습니다. –