2011-02-02 141 views
7

我正在使用来自服务提供者的二进制数据。我通过使用C++的HTTP请求来订阅这些数据。 我偶尔会得到来自这个提供者的HTML负载。该HTML有效载荷实际上是二进制数据,它看起来像这样:在C++字符串中使用二进制数据

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

我想用我得到的数据做模拟。要做到这一点,我硬编码字符串中的数据,并启动我的程序,将使用这些字符串。

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

的第一个问题我已经是我必须逃避所有的人物,如\n。但我不知道如何逃脱\0例如。另外,我有此错误信息,这可能是由于这样的事实,我不正确转义字符文件的末尾:

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

所以今天的主要问题是:什么是最终OF-文件字符看起来像,我怎样才能逃脱它?

那么,是否有一个Linux命令或从二进制文件中获取二进制数据的方法,并且使用\转义所有特殊字符,然后我只是将它复制粘贴到我的C++代码中。最后,我想将所有不同的有效载荷都放在二进制文件中,这样我就可以使用这个文件启动我的模拟。问题是我不知道如何区分不同的有效载荷,因为只要到下一行就行不通,因为它会被解释为一个随机字符(并且有效载荷没有固定大小) 。我不知道使用什么样的分离器。

回答

14

您可以将有效负载写入文件并使用std::ifstream来读取它。这将允许您更改有效内容,而无需重新编译。

如果你真的希望将其存储为二进制数据,你可以使用一个字符数组,并初始化它这样:

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) 
+0

我想的有效载荷存储在一个文件,但接缝像我必须把不同的有效载荷在不同的文件,因为我不知道该用什么分隔符。你也知道,如果我能得到一个脚本或命令从二进制数据中获取char数组?谢谢 – Arthur 2011-02-02 10:55:22