gpt4 book ai didi

c++ - 在 C++ 中使用移位器和缓冲区读取二进制文件

转载 作者:行者123 更新时间:2023-11-28 05:03:32 24 4
gpt4 key购买 nike

我正在尝试读取二进制文件并将数据简单地转换为可用的无符号整数。下面的代码适用于某些文件位置的 2 字节读取,并正确打印无符号整数。当我使用 4 字节代码时,虽然我的值结果是一个比预期大得多的数字。我认为问题出在读取函数中,好像我得到了错误的字符/十进制数(例如 101),当移位时变成一个比应该的数字大得多的数字(~6662342)。(当程序运行它时不时地抛出一个异常,然后“在 Visual Studio 中围绕变量 buf 运行时错误#2 堆栈”)。有任何想法吗?这可能是我对数据如何存储在影响我的数据输出的 char 数组中的基本了解。

工作2字节代码

unsigned char buf[2];
file.seekg(3513);
uint64_t value = readBufferLittleEndian(buf, &file);

printf("%i", value);

system("PAUSE");
return 0;

}


uint64_t readBufferLittleEndian(unsigned char buf[], std::ifstream *file)
{
file->read((char*)(&buf[0]), 2);
return (buf[1] << 8 | buf[0]);
}

损坏的 4 字节代码

unsigned char buf[8 + 1]; //= { 0, 2 , 0 , 0 , 0 , 0 , 0, 0, 0 };
uint64_t buf1[9];
file.seekg(3213);
uint64_t value = readBufferLittleEndian(buf, &file, buf1);

std::cout << value;


system("PAUSE");
return 0;

}


uint64_t readBufferLittleEndian(unsigned char buf[], std::ifstream *file, uint64_t buf1[])
{
file->read((char*)(&buf[0]), 4);
for (int index = 0; index < 4; index++)
{
buf1[index] = buf[index];
}
buf1[0];
buf1[1];
buf1[2];
buf1[3];
//return (buf1[7] << 56 | buf1[6] << 48 | buf1[5] << 40 | buf1[4] << 32 | buf1[3] << 24 | buf1[2] << 16 | buf1[1] << 8 | buf1[0]);
return (buf1[3] << 24 | buf1[2] << 16 | buf1[1] << 8 | buf1[0]);
//return (buf1[1] << 8 | buf1[0]);
}
Please correct me if I got the endianess reversed.

代码是 C++ 除了 printf 行

最佳答案

你必须在移动前施法。您不能将 char 左移 56 位。

即做((uint64_t)buf[n] << NN

关于c++ - 在 C++ 中使用移位器和缓冲区读取二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45357311/

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