gpt4 book ai didi

将字节数组转换为整数

转载 作者:行者123 更新时间:2023-12-02 02:53:26 28 4
gpt4 key购买 nike

我正在使用 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是你必须提供的东西。正如马丁已经提到的:sizeof text提供指针的大小。运算符(operator)无法确定这一点(如果您无法直接访问原始数组)。你应该做一个参数 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);
}
}
}

Live Demo on wandbox

注意:

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

关于将字节数组转换为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50782803/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com