【问题标题】:48 byte binary to 6 byte binary48 字节二进制到 6 字节二进制
【发布时间】:2012-10-03 00:44:00
【问题描述】:

我从命令行"13:22:45:33:99:cd" 读取了一个 17 字节的十六进制字符串,并希望将其转换为长度为 6 字节的二进制值。

为此,我从命令行"13:22:45:33:99:cd" 读取了一个 17 字节的十六进制字符串,并将其转换为二进制数字为0001 0011 0010 0010 0100 0101 0011 0011 1001 1001 1100 1101。但是,由于我使用的是 char 数组,它的长度为 48 个字节。我希望生成的二进制文件的长度为 6 个字节,即我希望 0001 0011 0010 0010 0100 0101 0011 0011 1001 1001 1100 1101 为 6 个字节(48 位)而不是 48 个字节。请建议如何完成此操作。

【问题讨论】:

    标签: c binary hex bytearray byte


    【解决方案1】:

    ':' 字符上拆分字符串,每个子字符串现在都是一个字符串,您可以将其传递给例如strtoul 然后放入一个大小为 6 的 unsigned char 数组。

    【讨论】:

      【解决方案2】:
      #include <stdio.h>
      
      const char *input = "13:22:45:33:99:cd";
      int output[6];
      unsigned char result[6];
      if (6 == sscanf(input, "%02x:%02x:%02x:%02x:%02x:%02x",
                      &output[0], &output[1], &output[2],
                      &output[3], &output[4], &output[5])) {
          for (int i = 0; i < 6; i++)
              result[i] = output[i];
      } else {
          whine("something's wrong with the input!");
      }
      

      【讨论】:

      • -1 实际上。这是不对的。首先,%x 用于ints,而不是chars。其次,char 可能是有符号类型,因此诸如 0xFF 之类的值将超出 char 的范围,从而导致有符号溢出,这反过来又是未定义的行为。
      • @AlexeyFrunze 注意到了这一点。固定。
      • @MichaelKrelin-hacker 为什么是 6?为什么不是 17 岁?
      • @auselen, scanf-family 函数返回分配的项目数,不是吗?
      • @MichaelKrelin-hacker 随意编辑帖子,我没明白你的意思。
      【解决方案3】:

      你把它们打包在一起。就像高半字节和低半字节一样:(hi&lt;&lt;4)|lo(假设两者都是 4 位)。

      虽然您可能更喜欢逐字节转换它们,而不是一开始就逐位转换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-08
        • 2013-05-22
        • 2018-12-11
        • 2011-07-27
        • 2017-11-22
        相关资源
        最近更新 更多