Нужно записать строку в файл в шестнадцатеричном формате на C ++ - PullRequest
0 голосов
/ 10 мая 2019

У меня есть строка, которая содержит шестнадцатеричное значение:

string str = "e101";

Мне нужно записать это в файл как 2 байта. В то время как я пытаюсь записать файл, он напишет как следующие 4 байта значение:

65 31 30 31

Я использую следующую операцию для записи файла:

    myfile.open ("file.cf3",std::ios::binary);
    myfile << str << "\n";
    myfile.close();

но я хочу записать его как 2-байтовое значение.

Например, если я g Как записать его как 2 байта в файл?

std::string wut="b6306edf953a6ac8d17d70bda3e93f2a3816eac333d1ac78";

я хочу вывод как

.0n..:j..}p...?*8...3..x

Ответы [ 3 ]

1 голос
/ 10 мая 2019

Вот пример решения.

#include <fstream>
#include <iostream>
#include <string>

int main() {
    std::ofstream file("file.txt", std::ios::binary);
    if(!file.is_open())  {
        return -1;
    }
    std::string str("e101");
    for (std::size_t i = 0; i < str.length() - 1; ++++i) {
        file << static_cast<char>(str[i] * 16 + str[i + 1]);
    }
    file.close();
}

Вы можете просто перебрать вашу строку и взять два символа одним байтом. Вы умножаете первый символ на 16 и добавляете второй символ.

1 голос
/ 10 мая 2019

Я думаю, что ваш вопрос неоднозначен ... Имейте в виду, что из вашей строки на каждые два символа у вас есть 1 байт (а не два).Итак, вы хотите написать два числа (что означает ascii), представляющих шестнадцатеричное значение строки ... Если это правильная интерпретация, вам нужно разбить строку на пары символов и затем преобразовать каждое в эквивалентное целое число.Вот мой код ... Он записывает в stdout, но вы можете легко изменить его для записи в файл вместо этого на экран.

#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <stdlib.h>
using namespace std;

int main () {
        string str = "e101";
        string two_char;
        unsigned char byte;

        for (int i=0 ; i<str.size(); i+=2) {
                two_char = str.substr(i,2);
                byte = strtol(two_char.c_str(),0,16);
                cout << two_char << " " << (int)byte <<"\n";
        }
}
0 голосов
/ 10 мая 2019

В ответ на ваш первоначальный вопрос о записи 2-байтовых двоичных данных в файл в C ++ у вас есть базовый двухэтапный процесс. (1) преобразуйте строковое представление числа в числовое значение, используя stoi с основанием 16. Это обеспечивает числовые значения, которые вы можете сохранить в unsigned short. (2) записать это значение в ваш файл с помощью f.write, а не frwite, где f - это ссылка на ваш открытый поток.

Если вы хотите отформатировать вывод в шестнадцатеричном формате для cout, тогда вы должны установить флаги для cout, чтобы выводить числовые значения в шестнадцатеричном формате (хотя это не является частью вашего вопроса, это связано с потоком I / O форматирование при желании.)

То есть, по сути, у вас есть строка и преобразована в число, например,

    std::string str = "e101";
    unsigned short u = stoi(str, 0, 16);

Теперь u содержит числовое значение, преобразованное из текста в str с использованием base-16 , которое вы можете просто записать в файл в виде 2-байтового значения, например,

    std::string filename = "out.bin";   /* output filename */
    ...
    std::ofstream f (filename, f.trunc | f.binary); /* open out in binary */
    if (!f.write(reinterpret_cast<char*>(&u), sizeof u)) {  /* write 2 bytes */
        std::cerr << "error: write of short to file failed.\n";
        return 1;
    }

В целом, вы можете сделать что-то короткое, чтобы вывести шестнадцатеричное значение, записываемое с помощью cout, а также записать его в файл "out.bin", например,

#include <fstream>
#include <iostream>
#include <iomanip>
#include <string>

int main (void) {

    std::string filename = "out.bin";   /* output filename */
    std::string str = "e101";
    unsigned short u = stoi(str, 0, 16);
    /* output converted value to terminal in hex */
    std::cout.setf(std::ios::hex, std::ios::basefield);  /* set hex output */
    std::cout << "writing value to file: " << u << '\n'; /* for cout */
    /* output converted value to file */
    std::ofstream f (filename, f.trunc | f.binary); /* open out in binary */
    if (!f.write(reinterpret_cast<char*>(&u), sizeof u)) {  /* write 2 bytes */
        std::cerr << "error: write of short to file failed.\n";
        return 1;
    }
}

Пример использования / Вывод

$ ./bin/stoi_short
writing value to file: e101

Результирующий выходной файл

Подтвердите, сбросив содержимое файла с помощью программы hexdump, например,

$ hexdump out.bin
0000000 e101
0000002

Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...