0

我想将整数(其最大值可以达到 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++;
}

任何帮助将不胜感激

4

3 回答 3

0

首先,不要使用 C 风格的强制转换(比如(long)aor (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。

这远非最快的方法,但至少接近您的原始方法。

于 2012-11-27T16:10:06.713 回答
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 回答