将 uint32_ts 和 uint_8ts 作为字符写入文件,然后将它们转换回 uint32_ts 和 uint_8ts
Writing uint32_ts and uint_8ts to file as chars & then converting them back into uint32_ts and uint_8ts
我正在将整数写入这样的文件:
for (int i = 0; i < 4; i++) {
writeInt8ToFile(126, ofst);
writeInt32ToFile(12500, ofst);
writeInt8ToFile(139, ofst);
}
(相关函数):
void writeInt32ToFile(std::uint32_t i, std::fstream &fstr)
{
fstr.write(reinterpret_cast<char *>(&i), sizeof(std::uint32_t));
}
void writeInt8ToFile(std::uint8_t i, std::fstream &fstr)
{
fstr.write(reinterpret_cast<char *>(&i), sizeof(std::uint8_t));
}
然后,我也希望能够将这些字符转换回整数。
我已经试过了:
(首先,将字节放入向量)
std::vector<char> infs_bytes(
(std::istreambuf_iterator<char>(infs)),
(std::istreambuf_iterator<char>()));
(然后,像这样将它们转换回 int):
// Iterate through all bytes
for (int i = 0; i < btVec.size() / MAP_BYTE_SIZE; i++) {
// Integers
std::uint8_t i1;
std::uint32_t i2;
std::uint8_t i3;
char buf[] = {btVec[i+1], btVec[i+2], btVec[i+3], btVec[i+4]}; // Middle 4 bytes
// memcpy all bytes to their corresponding integer types
std::memcpy(&i1, &btVec[i], 1); // First byte
std::memcpy(&i2, buf, 4);
std::memcpy(&i3, &btVec[i+5], 1); // Last byte
std::cout << (int)i1 << std::endl;
std::cout << i2 << std::endl;
std::cout << (int)i3 << std::endl;
}
但是,当我尝试输出到 stdout 时,如上一段所示,输出的是:
126
139
212
126
48
212
0
48
显然,这不是我写入文件的内容。预期输出为
126
12500
139
126
12500
139
126
12500
139
126
12500
139
你的循环
for (int i = 0; i < btVec.size() / MAP_BYTE_SIZE; i++) {
错了。您必须移动每个块的起始位置 MAP_BYTE_SIZE
个元素,而不是 1.
尝试
for (int j = 0; j < btVec.size() / MAP_BYTE_SIZE; j++) {
int i = j * MAP_BYTE_SIZE;
我正在将整数写入这样的文件:
for (int i = 0; i < 4; i++) {
writeInt8ToFile(126, ofst);
writeInt32ToFile(12500, ofst);
writeInt8ToFile(139, ofst);
}
(相关函数):
void writeInt32ToFile(std::uint32_t i, std::fstream &fstr)
{
fstr.write(reinterpret_cast<char *>(&i), sizeof(std::uint32_t));
}
void writeInt8ToFile(std::uint8_t i, std::fstream &fstr)
{
fstr.write(reinterpret_cast<char *>(&i), sizeof(std::uint8_t));
}
然后,我也希望能够将这些字符转换回整数。
我已经试过了:
(首先,将字节放入向量)
std::vector<char> infs_bytes(
(std::istreambuf_iterator<char>(infs)),
(std::istreambuf_iterator<char>()));
(然后,像这样将它们转换回 int):
// Iterate through all bytes
for (int i = 0; i < btVec.size() / MAP_BYTE_SIZE; i++) {
// Integers
std::uint8_t i1;
std::uint32_t i2;
std::uint8_t i3;
char buf[] = {btVec[i+1], btVec[i+2], btVec[i+3], btVec[i+4]}; // Middle 4 bytes
// memcpy all bytes to their corresponding integer types
std::memcpy(&i1, &btVec[i], 1); // First byte
std::memcpy(&i2, buf, 4);
std::memcpy(&i3, &btVec[i+5], 1); // Last byte
std::cout << (int)i1 << std::endl;
std::cout << i2 << std::endl;
std::cout << (int)i3 << std::endl;
}
但是,当我尝试输出到 stdout 时,如上一段所示,输出的是:
126
139
212
126
48
212
0
48
显然,这不是我写入文件的内容。预期输出为
126
12500
139
126
12500
139
126
12500
139
126
12500
139
你的循环
for (int i = 0; i < btVec.size() / MAP_BYTE_SIZE; i++) {
错了。您必须移动每个块的起始位置 MAP_BYTE_SIZE
个元素,而不是 1.
尝试
for (int j = 0; j < btVec.size() / MAP_BYTE_SIZE; j++) {
int i = j * MAP_BYTE_SIZE;