从整数转换为BCD

时间:2012-11-27 15:29:34

标签: c++ 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++;
}

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:0)

str实际上指向一个长(可能是4个字节),但迭代访问8个字节。 操作str[len]%10看起来好像在期待数字,但只有二进制数据。另外我怀疑i是否定为负。

答案 1 :(得分:0)

首先,不要使用C风格的演员表(如(long)a(char*))。它们味道很难闻。相反,学习和使用C ++样式转换(如static_cast<long>(a)),因为它们指出你在做dangeruos的事情,而不是只是默默地工作并导致未定义的行为。

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。

这远非最快的方法,但它至少接近你原来的方法。

答案 2 :(得分:0)

首先抱歉C代码,我被欺骗,因为这开始是一个C问题,移植到C ++不应该真的是一个大问题。

如果你真的希望它在一个char数组中,我会做类似下面代码的事情,我发现仍然有用的结果仍然是一个小的endian格式,所以我可以把它转换为int for打印出来,但这不是绝对必要的:

#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;
}