データ型のエンディアンを考慮すると問題が発生します。TCP/IPを使用してイーサネット経由でデータを送信する必要があります。ただし、バイトオーダーは、送信時にはビッグエンディアンである必要があり、受信時にはビッグエンディアンである必要があります。したがって、このクラスを使用して送信する前に、すべての日付を逆にしようとします。
class ReverseBinaryReader : BinaryReader
{
private byte[] a16 = new byte[2];
private byte[] ua16 = new byte[2];
private byte[] a32 = new byte[4];
private byte[] a64 = new byte[8];
private byte[] reverse8 = new byte[8];
public ReverseBinaryReader(System.IO.Stream stream) : base(stream) { }
public override int ReadInt32()
{
a32 = base.ReadBytes(4);
Array.Reverse(a32);
return BitConverter.ToInt32(a32, 0);
}
public override Int16 ReadInt16()
{
a16 = base.ReadBytes(2);
Array.Reverse(a16);
return BitConverter.ToInt16(a16, 0);
}
[ . . . ] // All other types are converted accordingly.
}
これは、変換された値を次のように割り当てるまでは正常に機能します。
ReverseBinaryReader binReader = new ReverseBinaryReader(new MemoryStream(content));
this.Size = binReader.ReadInt16(); // public short Size
たとえば、バイト:0x00、0x02をビッグエンディアンとして保存する場合、メモリにこれを期待します:0x0200ただし、Sizeの短い値は0x0002になります。何故ですか?
何か案は?ありがとう、ピア
//編集2:
問題を少し解決するために、例を示します。
public class Message {
public short Size;
public byte[] Content;
public Message(byte[] rawData)
{
ReverseBinaryReader binReader = new ReverseBinaryReader(new MemoryStream(rawData));
this.Size = binReader.ReadInt16(); // public short Size
this.Content = binReader.ReadBytes(2); // These are not converted an work just fine.
}
}
public class prog {
public static int main()
{
TCPClient aClient = new TCPClient("127.0.0.1",999); // Async socket
aClient.Send(new Message(new byte[] { 0x00, 0x02 } );
}
}