2017-11-07 23 views
-1

私はTCP経由でいくつかの値を通信するのにIEEE754形式を使用しています。この例では、intをbyte []に​​変換してから、BitConverterを使用してfloat(IEEE754 Single形式、32ビット)に変換しています。float(IEEE754)からbyte []への変換

この浮動小数点数をバイト[4]に格納する必要がありますが、元の値(指定された形式ではエンコードされません)に戻る必要はありません。 BitConverter.GetBytes()はそれを自動的に行います。そのため、私はそれを使用できません。

int volumeInt = (int)(volumeTest); 
byte[] volumeTank = new byte[4]; 

volumeTank[0] = (byte)(volumeInt >> 24); 
volumeTank[1] = (byte)(volumeInt >> 16); 
volumeTank[2] = (byte)(volumeInt >> 8); 
volumeTank[3] = (byte)(volumeInt >> 0); 

float volumeFloat = BitConverter.ToSingle(volumeTank, 0); 

EDIT

コンテキスト: 私はこれをやっている理由はASCIIとして[]バイトをエンコードし、TCPを介して送信される文字列に含めることです。 IEEE-754形式でなければならず、ASCII形式でエンコードする必要があります。私が探していた答えは、浮動小数点をバイト[]に変換する方法だけでした。

例:-8.380858E-27:それはfloatとしてIEEE754形式に変換することができます9876:int型を考えると

。今、私はこの値をフォーマットを失うことなく元の値(9876)に戻すことなく、バイト配列に格納します。

+2

「元の値に戻さない」とはどういう意味ですか?エンコードされたとはどういう意味ですか?あなたはエンディアンを意味しますか?または、これは 'int - > byte [] - > float - > byte []'でも動作するはずですが、 'float - > byte [] - > int'は動作しませんか?私はあなたのシナリオや達成しようとしていること、あるいはその理由を実際に得ていませんか? – Bauss

+0

「オリジナル値」とは、「IEEE754形式ではない」という意味です。私は同じことを "コード化されていない"と言っていましたが、この場合に使用するのが最良の単語ではないことがわかります。 – amorimph

+1

入力、出力、希望出力を表示すると、助けがはるかに簡単になります。 – Sinatr

答えて

1

フォーマットを修正しました。あなたがBigEndianについて同意したとしましょう。また、online hex converterには、16進文字列の別の表現を見るのに役立つことができます:

using System; 

public class Program 
{ 
    public static void Main() 
    { 
     float f = 9876f; 
     var bytes = GetBigEndian(f); 
     Console.WriteLine("{0} => {1}", f, BitConverter.ToString(bytes)); 
     Console.WriteLine("{0} => {1}", f, GetFloatFromBigEndian(bytes)); 
    } 

    static byte[] GetBigEndian(float v) 
    { 
     byte[] bytes = BitConverter.GetBytes(v); 
     if (BitConverter.IsLittleEndian) 
      Array.Reverse(bytes); 
     return bytes; 
    } 

    static float GetFloatFromBigEndian(byte[] bytes) 
    { 
     if (BitConverter.IsLittleEndian) 
      Array.Reverse(bytes); // We have to reverse 
     return BitConverter.ToSingle(bytes, 0); 
    } 
} 
関連する問題