【发布时间】:2011-07-17 02:19:35
【问题描述】:
我必须做的是以二进制模式打开一个文件,其中包含旨在被解释为整数的存储数据。我见过其他示例,例如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[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
另外,我不知道我的系统的字节序是如何在这里发挥作用的,所以我需要记住什么吗?
这是我目前所拥有的代码 sn-p,我只是不知道接下来要采取的步骤。
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);
我最终计划处理从文件中读取浮点数,最终可能是自定义数据类型,但首先我只需要更熟悉使用按位运算即可。 谢谢。
【问题讨论】:
-
除了固执之外,您可以通过读取 int 并使用 ntohl() 来做到这一点
-
你的二进制文件是“big-endian”。所以只要你用大端的方式把它的字节转换成整数,你就不用担心计算机的字节序了。
-
...直到您将代码移动到不同的系统,并尝试从大端系统中读取数据。那么你就会遇到问题。
-
@Thomi:因此大卫打电话给
ntohl()以防止这种情况发生
标签: c++ char int bit-manipulation