我正在使用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;
}
}
答案 0 :(得分:1)
关于OP的代码示例:
内循环没有意义(或者我没有理解意图)。
外部循环,我会改为:for (int i = 0; i + 3 < size; i += 4)
。请注意i + 3
。它使循环在缓冲区末尾的部分字节数上安全。 i += 4
在4字节跳转中进行适当的步骤。
size
是您必须提供的。正如Martin已经提到的那样:sizeof text
提供了指针的大小。操作员无法确定这一点(如果您无法直接访问原始阵列)。您应该为此创建参数size
。 (这是C程序中非常常见的解决方案。)
顺便说一下。 result
或instruction
没有声明。因此,我会将其中一个作为另一个函数参数。
因此,您的更改功能可能如下所示:
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);
}
}
}
注意:
我刚才意识到这种字节组合适用于大端数字(第一个位置的最高字节)。对于little-endian,指数必须重新排序。