C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■94842 / 5階層)  BigEndianでデータを読み込む方法
□投稿者/ 魔界の仮面弁士 (2725回)-(2020/05/23(Sat) 23:40:59)
No94841 (ひとひと さん) に返信
> そうでしたか、やはいないんのですね・・・・

Int16 , Int32 , Int64 限定であれば、
 Return System.Net.IPAddress.HostToNetworkOrder(reader.ReadInt16())
と書くことはできます。
https://docs.microsoft.com/ja-jp/dotnet/api/system.bitconverter.islittleendian?view=netframework-4.8

このメソッドは組となるよう
 IPAddress.NetworkToHostOrder()
 IPAddress.HostToNetworkOrder()
というメソッドが用意されています。

これが IPAddress クラスに実装されているのは、TCP/IP プロトコルにおいて、
IP アドレスやポート番号などが「ビッグエンディアン」で格納することになっているためでしょう。
逆変換まで別メソッドにする必要があったのかは疑問ですが。

また、実行環境のエンディアンを調べるための、
BitConverter.IsLittleEndian フィールドも用意されています。


> Return BitConverter.ToInt16(DataNumByte, 0)

そして ToInt16 メソッドは、上記の IsLittleEndian に対応することを想定した実装になっているようです。
https://referencesource.microsoft.com/#mscorlib/system/bitconverter.cs,64128518fca2c03f,references

>> fixed( byte * pbyte = &value[startIndex]) {
>>  if( startIndex % 2 == 0) { // data is aligned
>>   return *((short *) pbyte);
>>  }
>>  else {
>>   if( IsLittleEndian) {
>>    return (short)((*pbyte) | (*(pbyte + 1) << 8)) ;
>>   }
>>   else {
>>    return (short)((*pbyte << 8) | (*(pbyte + 1)));
>>   }
>>  }
>> }


IsLittleEndian フィールドは readonly です。
.NET Framework のソースコードをみると、値が静的に埋め込まれていますが、
他の互換フレームワーク…たとえば Mono においては
実行時に判定が行われる実装になっているようですね。

https://referencesource.microsoft.com/#mscorlib/system/bitconverter.cs,34
https://github.com/mono/mono/blob/master/mcs/class/corlib/System/BitConverter.cs
解決済み
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[4]: BigEndianでデータを読み込む方法 /ひとひと 返信無し
 
上記関連ツリー

BigEndianでデータを読み込む方法 / ひとひと (20/05/23(Sat) 20:13) #94833
Re[1]: BigEndianでデータを読み込む方法 / WebSurfer (20/05/23(Sat) 20:43) #94834
  └ Re[2]: BigEndianでデータを読み込む方法 / Hongliang (20/05/23(Sat) 20:53) #94836
    ├ Re[3]: BigEndianでデータを読み込む方法 / WebSurfer (20/05/23(Sat) 21:50) #94837
    │└ Re[4]: BigEndianでデータを読み込む方法 / Hongliang (20/05/23(Sat) 22:19) #94840
    └ Re[3]: BigEndianでデータを読み込む方法 / WebSurfer (20/05/23(Sat) 22:14) #94839
      └ Re[4]: BigEndianでデータを読み込む方法 / ひとひと (20/05/23(Sat) 22:47) #94841 解決済み
        └ BigEndianでデータを読み込む方法 / 魔界の仮面弁士 (20/05/23(Sat) 23:40) #94842 解決済み ←Now

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信