0

次の値を含む unsigned char 配列があります: "\x00\x91\x12\x34\x56\x78\x90"; つまり、16 進形式で送信される数値です。さらに、BCD 形式です: バイトで 00、別のバイトで 91 (8 ビット)

反対側では、この値を 0091234567890 としてデコードする必要があります。

私は次のコードを使用しています:

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 です。

私が理解したのは、16 進数値 (\x00\x91\x12\x34\x56\x78\x90) を送信していて、bcd 変換が 10 進数値に作用していることです。

出力をCharで00911234567890として受け取ることができるように助けてください。

よろしくカラン

4

3 に答える 3

3

unsigned int を単にオーバーフローしているように見えますが、これはおそらくシステム上で 32 ビットです。変化する:

     unsigned int convert =0;

に:

     uint64_t convert = 0;

の 64 ビット量を保証するためconvert

必ず追加してください:

#include <stdint.h>
于 2013-11-05T07:48:39.923 に答える
1

char を unsigned char にキャストし、%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;
}
于 2013-11-05T08:45:30.883 に答える
0

戻り値の型を に変更しunsigned long longて、十分な大きさの整数を確保してください。

pタイプを unsigned タイプに変更します。

先頭にゼロを付けて値を出力します。

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
于 2013-11-05T16:52:35.117 に答える