con*_*ych 5 c++ int bit-manipulation char
我必须做的是以二进制模式打开一个文件,其中包含要被解释为整数的存储数据.我见过其他例子,例如Stackoverflow - 从char*数组中读取"整数"大小的字节.但我想尝试采取不同的方法(我可能只是顽固,或愚蠢:/).我首先在十六进制编辑器中创建了一个简单的二进制文件,内容如下.
00 00 00 47 00 00 00 17 00 00 00 41
如果12个字节被分成3个整数,则该(应该)等于71,23和65.
在二进制模式下打开此文件并将4个字节读入字符数组后,如何使用按位运算使char [0]位成为int的前8位,依此类推,直到每个字符串的位为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
Run Code Online (Sandbox Code Playgroud)
另外,我不知道我的系统的字节顺序是如何发挥作用的,所以有什么我需要记住的吗?
这是我到目前为止的代码片段,我只是不知道接下来要采取的步骤.
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);
Run Code Online (Sandbox Code Playgroud)
我最终计划处理从文件中读取浮点数,最终可能是自定义数据类型,但首先我只需要更熟悉使用按位运算.谢谢.
Cam*_*ron 20
你想要按位左移运算符:
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];
Run Code Online (Sandbox Code Playgroud)
它的作用是将左参数向左移动指定的位数,从右边添加零作为填充.例如,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
}
Run Code Online (Sandbox Code Playgroud)
系统的字节顺序在这里并不重要; 你知道文件中表示的字节顺序,它是常量的(因此是可移植的),所以当你读入字节时,你知道如何处理它们.CPU /内存中整数的内部表示可能与文件的内部表示不同,但代码中对它的逻辑按位操作与系统的字节顺序无关; 最低有效位始终位于右侧,最左侧位于代码中.这就是为什么移动是跨平台的 - 它在逻辑位级别运行:-)
| 归档时间: |
|
| 查看次数: |
16175 次 |
| 最近记录: |