2012-11-27 42 views
0

我想將整數(其最大值可以達到99999999)轉換爲BCD並存儲到4個字符的數組中。 例如: 輸入爲:12345(整數) BCD中的輸出應爲=「00」,存儲在4個字符的數組中。 這裏0x00 0x01 0x23 0x45以BCD格式存儲。 我試圖在以下方式,但沒有工作從Integer轉換爲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++; 
} 

任何幫助將理解實際上

+0

我已經添加了一組代碼來做無符號整數轉換爲BCD在:http://stackoverflow.com/questions/1408361/unsigned-integer-to- BCD轉換/ 41598635#41598635 –

回答

0

str指向一個長(可能4個字節),但迭代訪問8個字節。 操作str[len]%10看起來好像您在等待數字,但只有二進制數據。另外我懷疑i變得消極。

0

首先,不要使用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,其中包含基數爲10的數字aux

然後,您可以查看s中的字符來構建您的BCD。

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

0

首先抱歉關於C代碼,自從C啓動以來,我被欺騙了,因爲C代碼移植到C++應該不是什麼大問題。

如果你真的想要它在一個字符數組中,我會做類似下面的代碼,我發現仍然有用,仍然留下一個小端格式的結果,所以我可以把它投到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; 
}