2013-11-05 2 views
0

"\ x00 \ x91 \ x12 \ x34 \ x56 \ x78 \ x90"값을 포함하는 부호없는 char 배열이 있습니다. 숫자가 16 진수 형식으로 전송됩니다. (8 비트) 난 다음 코드를 사용하고 0091234567890.BCD를 부호없는 char으로 변환

이 값을 디코딩하는데 필요한 반대편

다른 바이트의 바이트에 00, 91 : 는 또한 그것 BCD 포맷이다 :

unsigned int conver_bcd(char *p,size_t length) 
    { 
     unsigned int convert =0; 
     while (length--) 
      { 
      convert = convert * 100 + (*p >> 4) * 10 + (*p & 15); 
      ++p 
      } 
     return convert; 

}

그러나, 나는 얻는 결과는 내가 진수를 보내고있다 것을 이해 무엇 1430637214.

입니다 (\ x00 \ x91 \ x12 \ x34 \ x56 \ x78 \ x90) 내 bcd 변환은 소수 값에 따라 작동합니다. 나는 숯불에 00911234567890로

감사 카란를 출력을 수신 할 수 있도록

당신이 좀 도와 주시겠습니까

당신은 단순히 시스템에 아마도 32 비트를 당신의 서명 지능, 범람하는 것 같습니다
+3

오버 플로우 문제가 있습니다. 'unsigned int '는 (거의 확실하게) 32 비트, 즉 4 바이트이다. 32 비트 변수에 9 백 9 십억을 맞추는 방법은 없습니다. –

답변

3

. 변경 :

 unsigned int convert =0; 

에 :

 uint64_t convert = 0; 

convert에 대한 64 비트 량을 보장하기 위해.

추가해야합니다 : 서명 숯불에

#include <stdint.h> 
1

캐스트 문자가, 다음 % 02x로 인쇄 할 수 있습니다.

#include <stdio.h> 

int main(void) 
{ 
    char array[] = "\x00\x91\x12\x34\x56\x78\x90"; 
    int size = sizeof(array) - 1; 
    int i; 

    for(i = 0; i < size; i++){ 
     printf("%02x", (unsigned char)array[i]); 
    } 

    return 0; 
} 
0

리턴 유형을 unsigned long long으로 변경하여 정수가 충분히 큰지 확인하십시오.

p 유형을 부호없는 유형으로 변경하십시오.

앞에 오는 0이있는 값을 인쇄하십시오.

unsigned long long conver_bcd(const char *p, size_t length) { 
    const unsigned char *up = (const unsigned char*) p; 
    unsigned long long convert =0; 
    while (length--) { 
    convert = convert * 100 + (*up >> 4) * 10 + (*up & 15); 
    ++up; 
    } 
    return convert; 
} 

const char *p = "\x00\x91\x12\x34\x56\x78\x90"; 
size_t length = 7; 
printf("%0*llu\n", (int) (length*2), conver_bcd(p, length)); 
// 00911234567890 
+0

답변 해 주셔서 감사합니다. 예, unsigned int overflow의 문제였습니다. 다시 한번 감사드립니다. –

+0

@ user2955288 당신이 인정한 답변을 시도했을 때 (게시물을'서명되지 않은 int '에서'uint64_t'로 변경)'18446743384944119346'을 받았습니다. 흠? – chux

관련 문제