Использование двоичных данных в строке C ++ - PullRequest
7 голосов
/ 02 февраля 2011

Я работаю с двоичными данными, поступающими от поставщика услуг.Я подписываюсь на эти данные через HTTP-запрос, используя C ++.Время от времени я получаю полезную нагрузку HTML от этого провайдера.Полезная нагрузка HTML на самом деле представляет собой двоичные данные, которые выглядят так:

! ¦ô¿Âˤ ÍÌL? Àÿ Àÿ¥ š™©@ Àÿ Àÿ или ! H·ô¿Âˤ ÍÌL? Àÿ333?¥ š™©@ Àÿff¦@

Я хотел бы провести симуляцию, используя полученные данные.Для этого я жестко кодирую данные в строку и запускаю программу, которая будет использовать эти строки.

std::string input = "! ¦ô¿Âˤ ÍÌL? Àÿ Àÿ¥ š™©@ Àÿ Àÿ"

Первая проблема, с которой я столкнулся, заключается в том, что мне нужно экранировать все символы, такие как\n.Но я не знаю, как избежать, например, \0.Кроме того, у меня есть это сообщение об ошибке, которое может быть связано с тем, что я правильно не экранирую символ конца файла:

Error 3 fatal error C1004: unexpected end-of-file found

Итак, главный вопрос: чтокак выглядит символ конца файла, и как я могу его избежать?

Тогда есть ли команда linux или способ извлечь двоичные данные из двоичного файла и экранировать все специальные символы с помощью\ поэтому я просто копирую и вставляю его в мой код C ++.

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

1 Ответ

14 голосов
/ 02 февраля 2011

Вы можете записать свою полезную нагрузку в файл и прочитать ее, используя std::ifstream. Это позволит вам изменить полезную нагрузку без перекомпиляции.

Если вы действительно хотите сохранить его как двоичные данные, вы можете использовать массив char и инициализировать его следующим образом:

const unsigned char raw_data[] = {
    0x21, 0x20, 0xc2, 0xa6, 0xc3, 0xb4, 0xc2, 0xbf,
    0xc3, 0x82, 0xc3, 0x8b, 0xc2, 0xa4, 0x20, 0xc3,
    0x8d, 0xc3, 0x8c, 0x4c, 0x3f, 0x20, 0x20, 0xc3,
    0x80, 0xc3, 0xbf, 0x20, 0x20, 0xc3, 0x80, 0xc3,
    0xbf, 0xc2, 0xa5, 0x20, 0xc5, 0xa1, 0xe2, 0x84,
    0xa2, 0xc2, 0xa9, 0x40, 0x20, 0x20, 0xc3, 0x80,
    0xc3, 0xbf, 0x20, 0x20, 0xc3, 0x80, 0xc3, 0xbf,
    0x60, 0x20, 0x6f, 0x72, 0x20, 0x60, 0x21, 0x20,
    0x48, 0xc2, 0xb7, 0xc3, 0xb4, 0xc2, 0xbf, 0xc3,
    0x82, 0xc3, 0x8b, 0xc2, 0xa4, 0x20, 0xc3, 0x8d,
    0xc3, 0x8c, 0x4c, 0x3f, 0x20, 0x20, 0xc3, 0x80,
    0xc3, 0xbf, 0x33, 0x33, 0x33, 0x3f, 0xc2, 0xa5,
    0x20, 0xc5, 0xa1, 0xe2, 0x84, 0xa2, 0xc2, 0xa9,
    0x40, 0x20, 0x20, 0xc3, 0x80, 0xc3, 0xbf, 0x66,
    0x66, 0xc2, 0xa6, 0x40, 0x0a,
};

std::string data(
    reinterpret_cast< const char* >(raw_data),
    reinterpret_cast< const char* >(raw_data) + sizeof(raw_data));

О, кстати, я преобразовал вашу полезную нагрузку в буфер, используя следующий простой код Python:

#!/usr/bin/python

def convert_file(path, stream):
    data = open(path, 'rb').read()
    stream.write('const unsigned char raw_data[] = {')
    for i, char in enumerate(data):
        if i % 8 == 0:
            stream.write('\n   ')
        stream.write(' 0x%02x,' % (ord(char),))
    stream.write('\n};\n')

if __name__ == '__main__':
    import sys
    convert_file(sys.argv[1], sys.stdout)
...