[英]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.