2016-10-12 4 views
1

現在ソケットサーバで作業しています。 クライアントはBigEdian形式でデータを送信しますので、 thisパッケージを使用することを決定しました。しかし、Int64の場合、それは私に別の値を与えるビッグエンディアンのBinaryReaderは、長い読み込み時に誤った値を返します。

これはテストコードです。これは、これは私の結果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ビットパソコンを

おかげで窓があり、彼らは間違っているかどうかを知りません。

[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

ありがとうございました。バグがすでに提出されていることがわかりました。しかし、パッケージで変更されていない –

関連する問題