【问题标题】:convert an array of bytes into an integer将字节数组转换为整数
【发布时间】:2018-11-19 19:45:03
【问题描述】:

我正在使用 C 语言开发 IJVM 项目。 首先,我将一个二进制文件导入到我的程序中,它应该被解析为单词。 现在我创建了一个包含二进制文件的变量(文本),我需要将其转换为单词数组。我得到了提示

    int result = ((bytes[0] & 0xFF) << 24) |
    ((bytes[1] & 0xFF) <<16) |
    ((bytes[2] & 0xFF) << 8) | (bytes[3] & 0xFF);

这仅适用于前 4 个字节,我需要的是 result 的数组。

我尝试过这样的事情,但它从来没有成功.. :(

void type_converter(byte_t* text)
{
  for (int i = 0; i < sizeof(text)/4; i++) {
    for (int j = 0; i < sizeof(text)/4; i++) {

      int result[i] = ((text[j+0] & 0xFF) << 24) |
      ((text[j+1] & 0xFF) << 16) |
      ((text[j+2] & 0xFF) << 8) | (text[j+3] & 0xFF);
      instruction[i] = result;
      j =+ 4;
    }
  }

【问题讨论】:

  • 'sizeof(text)' is sizeof(a pointer)
  • 您必须将数组大小作为单独的参数传递。
  • for (int j = 0; i &lt; sizeof(text)/4; i++) { ij ?

标签: c arrays int byte ijvm


【解决方案1】:

关于OP的代码示例:

  • 内部循环没有意义(或者我没有理解意图)。

  • 外循环,我会改为:for (int i = 0; i + 3 &lt; size; i += 4)。请注意i + 3。它使循环对缓冲区末尾的部分字节数安全。 i += 4 在 4 字节跳转中做出适当的步骤。

  • size 是您必须提供的东西。正如 Martin 已经提到的:sizeof text 提供指针的大小。操作员没有机会确定这一点(如果您无法直接访问原始数组)。您应该为此创建一个参数size。 (这是 C 程序中非常常见的解决方案。)

  • 顺便说一句。 resultinstruction 没有声明。因此,我会将其中一个作为函数的另一个参数。

因此,您的更改函数可能如下所示:

void type_converter(uint32_t *result, byte_t *text, size_t size)
{
  for (size_t i = 0; i + 3 < size; i += 4) {
    result[i / 4]
      = ((text[i+0] & 0xFF) << 24)
      | ((text[i+1] & 0xFF) << 16)
      | ((text[i+2] & 0xFF) << 8)
      | (text[i+3] & 0xFF);
    }
  }
}

请不要忘记result 必须为size / 4 uint32_t 字词提供足够的存储空间。


因为我刚刚记得我过去是如何做类似事情的,所以可以稍微改变一下以防止 i + 3 循环条件:

void type_converter(uint32_t *result, byte_t *text, size_t size)
{
  for (size_t i = 3; i < size; i += 4) {
    result[i / 4]
      = ((text[i-3] & 0xFF) << 24)
      | ((text[i-2] & 0xFF) << 16)
      | ((text[i-1] & 0xFF) << 8)
      | (text[i] & 0xFF);
    }
  }
}

Live Demo on wandbox

注意:

我刚刚意识到这种字节组合适用于大端数字(第一个位置的最高字节)。对于 little-endian,索引必须重新排序。

【讨论】:

  • @user8747585 不客气。 - 我不得不承认我确实监督了一些我在准备MCVE 时意识到的小错误。现在,它已修复。
猜你喜欢
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 2014-10-17
相关资源
最近更新 更多