2013-10-07 2 views
2

더블 바이트 배열로 바이트 스트림을 복사하려고합니다. 바이트는 반드시 double 값을 나타내지는 않을 것이고, double 배열은 단지 저장 메커니즘으로 사용되고있다. (나는 이것이 이상하다는 것을 알지만, 현재의 프레임 워크에는 제한이있다. 그러나 어떤 경우에는 double 배열을 다시 바이트 배열로 복사 할 때 데이터가 변경된다는 것을 발견했습니다.더블 배열에 바이트 복사

나는

[TestMethod] 
    public void Test() 
    { 
     var bytes = new byte[] 
      { 
       24, 
       108, 
       6, 
       14, 
       7, 
       91, 
       242, 
       255 
      }; 

     double d = BitConverter.ToDouble(bytes, 0); 

     var returnedBytes = BitConverter.GetBytes(d); 

     for (int i = 0; i < returnedBytes.Count(); i++) 
     { 
      Assert.AreEqual(bytes[i], returnedBytes[i]); 
     } 
    } 

나는이 방법을 가지고 저를 중지 몇 가지 기본 프레임 워크 기능이 있음을 지금 실현 실패 다음 테스트 케이스로 좁혀왔다. 그러나 관심 밖으로 누구든지 위의 테스트 케이스가 실패하고있는 이유를 설명 할 수 있습니까?

+0

소스 (및 자신의 프로세서)가 사용하는 엔디안을 어떻게 알 수 있습니까? –

+0

이 경우 중요합니까? 위의 테스트 케이스는 전적으로 메모리와 동일한 프로세서 및 .Net 프레임 워크 내에서 수행됩니다. – mattythomas2000

답변

3

제공 한 값이 적어도 IEE754의 유효한 인코딩이 아니기 때문에 (적어도 리틀 엔디안 아키텍처에서는 사용자가 가지고있는 것임) 위에서 생성 한 doubleNaN이며 범위 내에서 계산되지 않는 이진 값의 전체 범위입니다. 프레임 워크가 '표준'또는 적어도 돌연변이 된 NaN을 반환한다는 것은 놀라운 일이 아닙니다.

당신의 32 비트 단어의 역순 경우 : 당신은 4.20332332290442E-241로 끝낼 수

7, 91, 242, 255, 24, 108, 6, 14 

합니다.

또는, 32 비트 워드 내의 바이트 의 순서를 반대로 :

14, 6, 108, 24, 255, 242, 91, 7 

수율 3.22903984511934E-273 마지막

거의 끝 전체 목록 (반전 64 비트 레지스터)

255, 242, 91, 7, 14, 6, 108, 24 

는 4.91380011890093E-191

012,351,641을 수득

그렇습니다. 소스 인코딩이 무엇이고 자신이 무엇인지 파악해야합니다. 이것은 32 비트 또는 64 비트 모드에서 실행 중인지 여부에 따라 달라질 수 있습니다.

+0

유효한 숫자가 반전 된 것처럼 보이지만 바이트 배열은 압축 알고리즘을 벗어나서 숫자가 의미가 있다고는 생각하지 않았습니다. 난 그냥 저장 메커니즘으로 더블 배열을 사용하려고했지만, 이것은 분명히 나쁜 생각이다 :) – mattythomas2000

+0

@ mattythomas2000 왜 그냥 '바이트 []'를 사용하지? 바이트를 8 바이트 블록으로 묶는 것은 무엇입니까? –

+0

예, 동의합니다. 우리는 double []을 처리 할 수있는 프레임 워크를 가지고 있지만 byte []를 처리 할 수는 없으므로 나는 영리 해 보일 것이라고 생각했습니다. 그러나 나는 해결책이 프레임 워크가 byte []를 처리하도록하는 것이라고 생각한다. 당신의 도움을 주셔서 감사합니다! – mattythomas2000

1

BitConverter은 비트를 전혀 사용하지 않으므로 심지어 검사하지 않기 때문에 무의미한 값을 볼 때 표준 NaN이 매핑되지 않습니다. 그러나 JIT가 CPU를 생성하여 코드를 생성 할 가능성이 있습니다.

double을 80 비트 레지스터에 넣으면 숨겨진 변환이 진행됩니다. 의사 C에서 :

float80 d = *(float64*)bytes; 
*(float64*)bytes = d; 

80 비트 레지스터와 64 비트 저장소 사이의 전환에서 CPU는 사용자의 가치를 악용합니다.

관련 문제