Запись uint32_ts и uint_8ts в файл как символы, а затем преобразование их обратно в uint32_ts и uint_8ts - PullRequest
1 голос
/ 04 августа 2020

Я пишу int в такой файл:

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;
}

Но, когда я пытаюсь вывести на стандартный вывод, как показано в последнем фрагменте, выводится вот что:

126
139
212
126
48
212
0
48

Очевидно, это не то, что я написал файл. Ожидаемый результат:

126
12500
139
126
12500
139
126
12500
139
126
12500
139

1 Ответ

1 голос
/ 04 августа 2020

Ваш l oop

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;
...