【问题标题】:Conversion from Integer to BCD从整数到 BCD 的转换
【发布时间】:2012-11-27 15:29:33
【问题描述】:

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

任何帮助将不胜感激

【问题讨论】:

标签: c++ bcd


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    首先,不要使用 C 风格的强制转换(如 (long)a(char*))。它们是难闻的气味。相反,学习和使用 C++ 风格转换(如 static_cast&lt;long&gt;(a)),因为它们指出你在哪里做危险的事情,而不是默默地工作并导致未定义的行为。

    char* str = (char*)&amp; aux; 给你一个指向 aux 的 bytes 的指针——它实际上是char* str = reinterpret_cast&lt;char*&gt;(&amp;aux);。它不会为您提供包含数字的传统字符串。 sizeof(char) 是 1,sizeof(long) 几乎可以肯定是 4,所以你的 aux 变量中只有 4 个有效字节。你继续尝试阅读其中的 8 个。

    我怀疑这是在做你想做的事。如果你想把一个数字打印成一个字符串,你必须运行实际的代码,而不仅仅是重新解释内存中的位。

    std::string s; std::stringstream ss; ss &lt;&lt; aux; ss &gt;&gt; s; 将创建一个 std::string,其中包含 aux 的基数为 10 位的数字。

    然后您可以查看s 中的字符来构建您的BCD。

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

    【讨论】:

      【解决方案3】:

      首先对 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-21
        • 1970-01-01
        相关资源
        最近更新 更多