c - 将字节数组转换为整数
问题描述
我正在使用 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;
}
}
解决方案
关于 OP 的代码示例:
内部循环没有意义(或者我不理解意图)。
外循环,我将更改为:
for (int i = 0; i + 3 < size; i += 4)
. 请注意i + 3
. 它使循环对缓冲区末尾的部分字节数安全。在i += 4
4 字节跳转中进行适当的步骤。这
size
是你必须提供的东西。正如 Martin 已经提到的:sizeof text
提供指针的大小。操作员没有机会确定这一点(如果您无法直接访问原始数组)。你应该size
为此做一个参数。(这是 C 程序中非常常见的解决方案。)顺便提一句。
result
or没有声明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,索引必须重新排序。
推荐阅读
- scikit-learn - 如何在有条件和限制的情况下进行预测?
- c# - Gitlab API:单元测试问题、项目和登录问题
- mysql - 编写视图以将具有两列的表转换为具有多列
- uwp - UWP:InAppNotification 未显示
- java - 爪哇。如何防止将方法引用分配给功能接口类型参数?
- validation - 根据数据在 Google 表格中添加自动填充选项
- simulink - MATLAB C S-Function不能在simulink实时编译
- tensorflow - 如何在每批之后获取一个时期的历史
- javascript - 有没有更简单的方法或不同的方法可以在 JavaScript 中处理这个标志验证?
- c - 将静态库 czmq 添加到 C 项目 (CMake)