gpt4 book ai didi

c++ - 在 C++ 中使用按位运算符将 4 个字符更改为 int

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:51:08 24 4
gpt4 key购买 nike

我必须做的是以二进制模式打开一个文件,其中包含旨在解释为整数的存储数据。我见过其他例子,例如 Stackoverflow-Reading “integer” size bytes from a char* array.但我想尝试采取不同的方法(我可能只是固执或愚蠢 :/)。我首先在十六进制编辑器中创建了一个简单的二进制文件,内容如下。

00 00 00 47 00 00 00 17 00 00 00 41
如果将 12 个字节分成 3 个整数,这(应该)等于 71、23 和 65。

以二进制模式打开此文件并将 4 个字节读入 char 数组后,如何使用按位运算使 char[0] 位成为 int 的前 8 位,依此类推,直到每个 char 的位是 int 的一部分。

 
My integer = 00 00 00 00
+ ^ ^ ^ ^
Chars Char[0] Char[1] Char[2] Char[3]
00 00 00 47


So my integer(hex) = 00 00 00 47 = numerical value of 71

此外,我不知道我的系统的字节顺序在这里如何发挥作用,所以有什么我需要记住的吗?

这是我目前所拥有的代码片段,我只是不知道接下来要采取的步骤。


std::fstream myfile;
myfile.open("C:\\Users\\Jacob\\Desktop\\hextest.txt", std::ios::in | std::ios::out | std::ios::binary);
if(myfile.is_open() == false)
{
std::cout << "Error" << std::endl;
}
char* mychar;
std::cout << myfile.is_open() << std::endl;
mychar = new char[4];
myfile.read(mychar, 4);

我最终计划处理从文件中读取 float ,最终可能是自定义数据类型,但首先我只需要更熟悉使用按位运算。谢谢。

最佳答案

您需要按位左移运算符:

typedef unsigned char u8;  // in case char is signed by default on your platform
unsigned num = ((u8)chars[0] << 24) | ((u8)chars[1] << 16) | ((u8)chars[2] << 8) | (u8)chars[3];

它所做的是将左边的参数向左移动指定的位数,从右边添加零作为填充。例如,2 << 1是 4,因为 2 是 10在二进制中向左移动一位给出 100 , 即 4.

这可以写成更通用的循环形式:

unsigned num = 0;
for (int i = 0; i != 4; ++i) {
num |= (u8)chars[i] << (24 - i * 8); // += could have also been used
}

你的系统的字节顺序在这里并不重要;你知道文件中表示的字节序,它是常量(因此可移植),所以当你读入字节时,你知道如何处理它们。整数在您的 CPU/内存中的内部表示可能与文件中的不同,但在代码中对它的逻辑位操作与您系统的字节顺序无关;最低有效位总是在右边,最重要的在左边(在代码中)。这就是为什么移位是跨平台的——它在逻辑位级别运行:-)

关于c++ - 在 C++ 中使用按位运算符将 4 个字符更改为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5334268/

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