2012-05-02 2 views
0

정렬 된 배열 uint8[8]double으로 변환하려고하면 약간의 문제가 있습니다. uint8[4]을 비트 조작으로 long으로 변환하는 것이 특히 쉽지만, double이 부호 비트의 측면에서 지저분해질 수 있다는 것을 알고 있습니까?정렬 된 배열 uint8 [8]을 double로 변환

자바에서

나는 단순히 ByteBuffer.wrap(bytes).getDouble()을 사용하지만 난 그 쉽지 않다 가정이 코드를 구현하기 위해 노력

C.

에,하지만 마지막 명령은 오류를 제공 Expression is not assignableShift count >= width of type

long tempHigh = 0; 
long tempLow = 0; 
double sum = 0; 
tempHigh |= buffer[0] & 0xFF; 
tempHigh <<= 8; 
tempHigh |= buffer[1] & 0xFF; 
tempHigh <<= 8; 
tempHigh |= buffer[2] & 0xFF; 
tempHigh <<= 8; 
tempHigh |= buffer[3] & 0xFF; 

tempLow |= buffer[4] & 0xFF; 
tempLow <<= 8; 
tempLow |= buffer[5] & 0xFF; 
tempLow <<= 8; 
tempLow |= buffer[6] & 0xFF; 
tempLow <<= 8; 
tempLow |= buffer[7] & 0xFF; 

sum |= ((tempHigh & 0xFFFF) <<= 32) + (tempLow & 0xFFFF); 

어떻게 이 절차를 올바르게 수행 또는 내가 만든 오류를 해결 그냥?

미리 감사드립니다.

답변

2

그 다음, 비트 연산과 정수 변수에 부호, 지수 및 가수의 값을 읽어 지수를 적용 할 ldexp를 호출하는 것입니다 할 수있는 휴대용 방법.

좋아, 여기에 몇 가지 코드가 있습니다. 불일치 한 괄호 또는 하나씩 잘못된 오류가있을 수 있습니다.

unsigned char x[8]; // your input; code assumes little endian 
long mantissa = ((((((x[6]%16)*256 + x[5])*256 + x[4])*256 + x[3])*256 + x[2])*256 + x[1])*256 + x[0]; 
int exp = x[7]%128*16 + x[6]/16 - 1023; 
int sign = 1-x[7]/128*2; 
double y = sign*ldexp(0x1p53 + mantissa, exp-53); 
+0

예를 들어 주시겠습니까? 나는 지금 사인 문제를 보았습니다. – JavaCake

+0

빅 엔디안의 경우 모든 것을 뒤집어 야합니까? – JavaCake

+0

* 데이터 *가 빅 엔디안 인 경우 배열 오프셋을 뒤집어 야합니다. 코드는 기계 엔디안과 100 % 독립적입니다. –

3

double은 부동 소수점 유형입니다. |과 같은 비트 연산을 지원하지 않습니다.

당신은 같은 것을 할 수있는 :

double sum; 

memcpy(&sum, buffer, sizeof(sum)); 

을하지만 엔디안 문제를 고려해야합니다.

+0

대체 하시겠습니까? 감사. – JavaCake

2

노조는 어떻습니까? 당신이 가지고있는 것처럼 긴 부분에 글을 쓰면, 더블은 자동적으로 정확합니다. 이런 식으로 뭔가 :

union 
{ 
    double sum; 
    struct 
    { 
     long tempHigh; 
     long tempLow; 
    }v; 
}u; 

u.v.tempHigh = 0; 
u.v.tempHigh |= buffer[0] & 0xFF; 
u.v.tempHigh <<= 8; 
u.v.tempHigh |= buffer[1] & 0xFF; 
u.v.tempHigh <<= 8; 
u.v.tempHigh |= buffer[2] & 0xFF; 
u.v.tempHigh <<= 8; 
u.v.tempHigh |= buffer[3] & 0xFF; 

u.v.tempLow |= buffer[4] & 0xFF; 
u.v.tempLow <<= 8; 
u.v.tempLow |= buffer[5] & 0xFF; 
u.v.tempLow <<= 8; 
u.v.tempLow |= buffer[6] & 0xFF; 
u.v.tempLow <<= 8; 
u.v.tempLow |= buffer[7] & 0xFF; 

printf("%f", u.sum);