簡體   English   中英

從整數轉換為BCD

[英]Conversion from Integer to BCD

我想將整數(其最大值可以達到99999999)轉換為BCD並存儲到4個字符的數組中。 例如:輸入為:12345(整數)在BCD中,輸出應為=“ 00012345”,並存儲在4個字符的數組中。 這里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++;
}

任何幫助將不勝感激

str實際上指向一個長字節(可能是4個字節),但是迭代訪問了8個字節。 str[len]%10看起來像您期望數字,但是只有二進制數據。 另外我懷疑i會變得消極。

首先,不要使用C樣式的強制類型轉換(例如(long)a(char*) )。 他們是難聞的氣味。 相反,學習並使用C ++樣式強制轉換(例如static_cast<long>(a) ),因為它們指出了您在做危險的事情,而不僅僅是默默地工作並導致未定義的行為。

char* str = (char*)& aux; 給您一個指向aux 字節的指針-實際上是char* str = reinterpret_cast<char*>(&aux); 它不會為您提供帶數字的傳統字符串。 sizeof(char)為1, sizeof(long)幾乎為4,因此aux變量中只有4個有效字節。 您繼續嘗試閱讀其中的8個。

我懷疑這正在做您想要做的事情。 如果要將數字打印成字符串,則必須運行實際代碼,而不僅僅是重新解釋內存中的位。

std::string s; std::stringstream ss; ss << aux; ss >> s; 會創建一個std::string ,其中以aux為基數的10位數字。

然后你可以看一下字符s建立自己的BCD。

這不是最快的方法,但至少接近您的原始方法。

首先,對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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM