問題

私はリトルエンディアンにsomevaluesを変換したい。私は次のようにintをリトルエンディアンに変換することに問題はありません

 private string ConverToLittleendian(string value)
{            
   var reversedBytes = System.Net.IPAddress.NetworkToHostOrder(Convert.ToInt32(value)); 
   var littleEndienSerialNumber = reversedBytes.ToString("x");    
   return  littleEndienSerialNumber.PadLeft(8, '0').ToUpper();
}
 

浮動小数点数については、整数を期待するため、NetworkHostOrderにfloat値を与えることはできません。

だから私は次のコードを見つけました

 private string ConverToLittleendian(float value)
{ 
   byte[] bytes = BitConverter.GetBytes(value);
   Array.Reverse(bytes);
   return BitConverter.ToString(bytes).Replace("-", "");
}
 

どういうわけかそれは間違った価値を与える。私はこれらのメソッドを1234でテストしました(私はそれが浮動小数点ではないことを知っていますが、この場合はうまくいくはずです)

最初の方法は、結果D2040000を取得します 2番目の方法は、結果449A400を取得します

なぜそれが違うのか分かりません。本当に浮動小数点値をリトルエンディアンに変換するときに、正しい値を取得する必要があることを確認したいと思います。

私はどこで間違いをしていますか?

  ベストアンサー

私はあなたがバイナリで表される方法のために混乱しているかもしれないと思います。

Floating-point番号(C#)では、 IEEE 754 を使用してバイナリで表現します。

 {sign}{exponent}{mantissa}.
 

整数はそれよりも基本的です。符号付き整数は次のように表されます。

 {sign}(mantissa}.
 

フロートとしての1234は、big-endianの0x449A4000 です。 little-endianの0x00409A44

int としての1234は、big-endianの0x000004D2 です。 (あなたの結果として)little-endianの0xD2040000


内部的には異なって格納されているため、1234(int)が1234.0(浮動小数点数)と同じバイナリ表現を持つことは期待されません。

1234(int)と1234.0(float)が同じバイナリ表現を持っている場合、1235はint表現の1ビットで異なると予想されます(はbig-endianの0x000004D3 です。 littleendianの0xD3040000)。

しかし、それは1234.5(浮動小数点数)のためにあなたをどこに置いていますか?整数表現を使用して得ることができる最も近いのは0x000004D2.8です(.8は10進数で0.5に相当する16進数です)。 0x000004D20x000004D3の間のバイナリ番号全体を持つことはできません。これは、浮動小数点演算が入ってくる場所です。

  同じタグがついた質問を見る

c#floating-pointtype-conversionendianness