2017-11-07 30 views
-1

나는 IEEE754 형식을 사용하여 TCP를 통해 일부 값을 전달합니다. 이 예제에서는 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); 

아이디어가 있으십니까?

편집

상황 :이 일을 해요 이유는 TCP를 통해 전송됩니다 문자열에 포함 ASCII로하고 바이트 []를 인코딩하는 것입니다. IEEE-754 형식이어야하며 ASCII로 인코딩되어야합니다. 비록 내가 찾고 있던 대답은 단지 float을 byte []로 변환하는 방법이었습니다.

예 :

의 int 감안할 때 : 그것은 float로서 IEEE754 형식으로 변환 할 수 있습니다 9876 : -8.380858E-27. 이제이 값을 형식을 잃지 않고 원래 값 (9876)으로 돌아 가지 않고 바이트 배열에 저장하고 싶습니다.

+2

를? 그리고 인코딩 된 것은 무엇을 의미합니까? 엔디안을 말하는거야? 아니면 이것이 'int -> byte [] -> float -> byte []'일을해야하지만,'float -> byte [] -> int'는 작동하지 않아야한다는 것을 의미합니까? 나는 당신의 시나리오를 얻지 못했거나 당신이 달성하고자하는 것 또는 심지어 그 이유를 얻지 못합니까? – Bauss

+0

"원래 값"이란 "IEEE754 형식이 아닙니다"라는 의미입니다. 나는 "인코딩되지 않은"것에 의해 같은 것을 의미했다. 나는이 경우에 사용할 최고의 단어가 아니라는 것을 안다. – amorimph

+1

입력, 출력 및 원하는 출력을 표시하면 훨씬 쉽게 도움이됩니다. – Sinatr

답변

1

형식을 수정하면 BigEndian에 대한 합의가 있다고 가정 해 보겠습니다. 또한 여기에 16 진수 문자열의 다른 표현 볼 수 있습니다 online hex converter에서 "원래 값으로 돌아 가지 않고"무슨 뜻 이죠

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); 
    } 
}