将字节数组转换为整数

3

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

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

这个只对前四个字节有效,我需要的是一个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;
    }
  }

1
'sizeof(text)' 是指一个指针的大小 - Martin James
1
你必须将数组大小作为单独的参数传递。 - HolyBlackCat
1
for (int j = 0; i < sizeof(text)/4; i++) { i 还是 j - Jean-François Fabre
1个回答

1

关于 OP 的代码示例:

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

  • 外部循环,我会改成:for (int i = 0; i + 3 < 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 / 4uint32_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);
    }
  }
}

在Wandbox上查看演示

注意:

我刚刚意识到这种字节组合是针对大端数字(最高位字节在第一位置)。对于小端,索引必须重新排序。


@user8747585 不客气。- 我必须承认,我在准备一个MCVE时意识到了一些小错误。现在已经修复了。 - Scheff's Cat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接