2017-05-22 8 views
1

이 작업을 올바르게 수행하지 않으면이 방법을 사용하여 바이트 배열을 다음과 같이 부동 배열로 변환합니다. link :원시 바이트 데이터를 float []로 변환하고 값은 -1과 1 사이 여야합니다.

public static float[] ConvertByteToFloat(byte[] array) { 
     float[] floatArr = new float[array.Length/4]; 
     for (int i = 0; i < floatArr.Length; i++) { 
       if (BitConverter.IsLittleEndian) { 
       Array.Reverse(array, i * 4, 4); 
       } 
       floatArr[i] = BitConverter.ToSingle(array, i * 4); 
     } 
     return floatArr; 
} 

입력 어레이 (NO 헤더) 파 원 데이터를 포함하는 배열

문제 난 (변환 후) 얻고이다 같은 값된다

012,351 6,

-9.66012E + 24 1963.15576, -5.11384777E-36, 07 -1.19718621E

가 어떻게 float 배열이 배열 변환 할 수 있고 그 값은 -1.0 1.0 사이되어야 하는가?

편집 :

내 입력 배열은 다음과 같이 시작합니다

byte[] { 
    232, 
    255, 
    235, 
    255, 
    232, 
    255, 
    235, 
    255, 
    232, 
    255, 
    235, 
    255, 
    232, 
    255, 
    235, 
    255, 
... 
} 
+0

시도'BitConverter.IsLittleEndian'을 제거하고 우리가 무시한다면 (이 코드는 올바른 것 같다 ... 이제 어떻게되는지 내가 NaN을 – xanatos

+0

하자 가능한 'IsLittleEndian' 문제) ... 예를 들어 시퀀스의 일부 바이트 (약 16 바이트 정도면 충분합니다)를 말할 수 있습니다 ... 4 바이트 부동 소수점 값이고 8 바이트가 아닌 것은 확실합니까? –

+1

을 얻고있다 – xanatos

답변

3

당신은 the implementation of WriteSample() 볼 수 있습니다 : 그것은 float 16 비트로 전환한다는 서명 방법

public void WriteSample(float sample) 
    { 
     if (WaveFormat.BitsPerSample == 16) 
     { 
      writer.Write((Int16)(Int16.MaxValue * sample)); 
      dataChunkSize += 2; 
     } 
     ... 

주 정수에 Int16.MaxValue을 곱합니다. 이는 내부 데이터 형식이 -Int16.MaxValue와 + Int16.MaxValue 사이의 16 비트 정수로 서명 되었기 때문입니다.

즉, 작업중인 값이 Int16 (일명 short)이며,이 값을 Int16.MaxValue으로 나눠서 다시 부동으로 변환해야합니다. 샘플 입력 주어진 예를 들어

:

byte[] bytes = { 232, 255, 235, 255, 232, 255, 235, 255, 232, 255, 235, 255, 232, 255, 235, 255 }; 

for (int i = 0; i < bytes.Length - 4; i += 4) 
{ 
    float f = BitConverter.ToInt16(bytes, i)/(float)Int16.MaxValue; 
    Console.WriteLine(f); 
} 
+0

이것이 올바른 대답이라고 생각합니다. 그것은 저에게 효과적이었습니다. 나는 스펙트럼을 그리고 그 값은 -1과 1 사이이고 스펙트럼은 괜찮습니다. float f = BitConverter.ToInt16 (bytes, i)/(float) 만 변경하면됩니다. Int16.MaxValue; float f = BitConverter.ToInt16 (바이트, i/4)/(실수) Int16.MaxValue; –