C#でエンディアン指定して符号なし変数に変換する。
Webの通信なのでBinaryデータを扱って、通信先でデコードする場合エンディアンを指定する必要があります。 Webでは基本的にBigEndian形式で変換されたデータを使用して、通信が行われます。一方PC上の内部構造はLittleEndianが使用されています。 C#でリトルエンディアンをビッグエンディアンに変換する - PG日誌
下記でPC上でどちらが使用されているかを確認することが可能です。
Console.WriteLine(BitConverter.IsLittleEndian);
ネットワークの場合、符号付き整数を扱う場合のみ、 IPAddress.NetworkToHostOrder
を使用すればBigEndian方式に変換することが可能です。IPAddress.NetworkToHostOrder メソッド (System.Net) | Microsoft Docs
しかし、符号なし整数の場合は、Network関係のメソッドにはメソッドが用意されていないので、別のメソッドを使用する必要がある。
そこで発見したのがBinaryPrimitives.ReadInt16LittleEndian(ReadOnlySpan<Byte>) メソッド (System.Buffers.Binary) | Microsoft Docs
using System.Buffers.Binary; var value = 16UL; // BitConverterはLittleEndianでエンドードさていている。 var intValue = BitConverter.GetBytes(value); Console.WriteLine(BinaryPrimitives.ReadUInt64LittleEndian(new ReadOnlySpan<byte>(intValue))); var bytes = new byte[8]; // BigEndianでエンコード、デコードする。 BinaryPrimitives.WriteUInt64BigEndian(bytes, value); Console.WriteLine(BinaryPrimitives.ReadInt64BigEndian(new ReadOnlySpan<byte>(bytes)));