如何将char数组转换为HEX值列表?

时间:2010-09-20 23:35:43

标签: c++

我是否希望能够将char数组(可能是二进制数据)转换为以下格式的HEX值列表:ab 0d 12 f4等....

我尝试用

做这件事

lHexStream<< “<” << std :: hex<< std :: setw(2)<<字符<< “>” 中;

但这不起作用,因为我将数据打印出来:

<ffe1><2f><ffb5><54>< 6><1b><27><46><ffd9><75><34><1b><ffaa><ffa2><2f><ff90><23><72><61><ff93><ffd9><60><2d><22><57>

请注意,某些值中包含4个HEX值?例如

我想要的是他们在wireshark中所拥有的东西,它们代表HEX格式的字符(或二进制数据),如:

08 0a 12 0f

其中每个字符值仅由上面显示的表单的2个HEX字符表示。

3 个答案:

答案 0 :(得分:3)

看起来大于0x80的字节值被符号扩展为short(我不知道为什么它会在短时间内停止,但现在这并不重要)。试试这个:

IHexStream << '<' << std::hex << std::setw(2) << std::setfill('0')
           << static_cast<unsigned int>(static_cast<unsigned char>(character))
           << '>';

可以能够移除外部阵营,但我不会依赖它。

编辑:添加了std :: setfill调用,您需要获取&lt; 06&gt;而不是&lt; 6。帽子尖端到jkerian;我自己几乎没有使用过iostreams。使用fprintf:

,这会短得多
fprintf(ihexfp, "<%02x>", (unsigned char)character);

答案 1 :(得分:2)

正如Zack所提到的,4字节值是因为它将128以上的所有值解释为负值(基类型为signed char),然后当值扩展为有符号的short时,“负值”会被扩展。

就个人而言,我发现以下内容工作得相当好:

char *myString = inputString;
for(int i=0; i< length; i++)
    std::cout << std::hex << std::setw(2) << std::setfill('0') 
              << static_cast<unsigned int>(myString[i]) << " ";

答案 2 :(得分:0)

我认为问题在于,当您阅读字符时,二进制数据被解释为多字节编码。事实证明,您的示例中的每个4字符十六进制代码都在低位字节中设置了高位。

您可能希望以ascii模式读取二进制流。