我想将整数(其最大值可以达到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++;
}
任何帮助将不胜感激
答案 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;
}