0

整数 (最大値は 99999999 に達する可能性があります) を BCD に変換し、4 文字の配列に格納したいと考えています。例: 入力: 12345 (整数) 出力は、4 文字の配列に格納されている BCD で = "00012345" である必要があります。ここ0x00 0x01 0x23 0x45では BCD 形式で保存されます。以下の方法で試しましたが、うまくいきませんでした

int decNum = 12345;
long aux;
aux = (long)decNum;
cout<<" aux = "<<aux<<endl;

char* str = (char*)& aux;
char output[4];
int len = 0;
int i = 3;
while (len < 8)
{
cout <<"str: " << len << " " << (int)str[len] << endl;
unsigned char temp = str[len]%10;
len++;
cout <<"str: " << len << " " << (int)str[len] << endl;
output[i] = ((str[len]) << 4) | temp;
i--;
len++;
}

どんな助けでも大歓迎です

4

3 に答える 3

0

まず第一に、C コードについて申し訳ありません。これは C の質問として始まったので騙されました。C++ への移植はそれほど大したことではないはずです。

本当にchar配列にしたい場合は、次のコードのようなことをします。結果をリトルエンディアン形式のままにしておくと便利なのでint、印刷用にキャストできますが、厳密にはそうではありません必要:

#include <stdio.h>

typedef struct
{
    char value[4];
} BCD_Number;

BCD_Number bin2bcd(int bin_number);

int main(int args, char **argv)
{
    BCD_Number bcd_result;

    bcd_result = bin2bcd(12345678);

    /* Assuming an int is 4 bytes */
    printf("result=0x%08x\n", *((int *)bcd_result.value));

}

BCD_Number bin2bcd(int bin_number)
{
    BCD_Number bcd_number;  

    for(int i = 0; i < sizeof(bcd_number.value); i++)
    {
        bcd_number.value[i] = bin_number % 10;
        bin_number /= 10;
        bcd_number.value[i] |= bin_number % 10 << 4;
        bin_number /= 10;
    }

    return bcd_number;
}
于 2012-11-27T16:55:47.233 に答える
0

str実際には long (おそらく 4 バイト) を指しますが、反復では 8 バイトにアクセスします。操作str[len]%10は数字を期待しているように見えますが、バイナリ データしかありません。さらに、それiがマイナスになるのではないかと思います。

于 2012-11-27T15:46:46.653 に答える
0

(long)aまず、C スタイルのキャスト (やなど)を使用しないでください(char*)。彼らは悪臭です。代わりに、C++ スタイルのキャスト ( などstatic_cast<long>(a)) を学習して使用します。これは、静かに作業して未定義の動作を引き起こすのではなく、危険な作業を行っている場所を指摘するためです。

char* str = (char*)& aux;aux のバイトへのポインタが得られます。実際にはそうchar* str = reinterpret_cast<char*>(&aux);です。数字を含む従来の文字列は得られません。 sizeof(char)は 1、ほぼ確実に 4 であるため、変数sizeof(long)には 4 つの有効なバイトしかありません。auxあなたはそれらのうちの8つを読み込もうとします。

これがあなたがやりたいことをしているとは思えません。数値を文字列に出力したい場合は、メモリ内のビットを再解釈するだけでなく、実際のコードを実行する必要があります。

std::string s; std::stringstream ss; ss << aux; ss >> s;std::stringの基数 10 の数字を含む を作成しますaux

次に、文字を見て、sBCD を作成できます。

これは最速の方法とはほど遠いですが、少なくとも元のアプローチに近いものです。

于 2012-11-27T16:10:06.713 に答える