将ASCII std::string转换为十六进制

7
有没有一种简单的方法将ASCII std :: string转换为HEX?我不想将其转换为数字,我只想将每个ASCII字符转换为其HEX值。输出格式也应该是std :: string。 例如:“TEST”将变为“0x54 0x45 0x53 0x54”或类似格式。
我找到了这个解决方案,但也许有更好的解决方案(无需将字符串转换为int再转换为字符串)。
std::string teststring = "TEST";
std::stringstream hValStr;
for (std::size_t i=0; i < teststring.length(); i++)
{
    int hValInt = (char)teststring[i];
    hValStr << "0x" << std::hex << hValInt << " ";
}

感谢您,/mspoerr
2个回答

7
如果你不关心0x,使用std::copy很容易实现:
#include <algorithm>
#include <sstream>
#include <iostream>
#include <iterator>
#include <iomanip>

namespace {
   const std::string test="hello world";
}

int main() {
   std::ostringstream result;
   result << std::setw(2) << std::setfill('0') << std::hex << std::uppercase;
   std::copy(test.begin(), test.end(), std::ostream_iterator<unsigned int>(result, " "));
   std::cout << test << ":" << result.str() << std::endl;
}

如果您需要,我会发布一个更新版本,展示如何添加0x。 - Flexo
1
不幸的是,这不能与ASCII字符(如0xFF)一起使用。我使用string::read()函数读取一个带有ASCII值> 0x7F的无符号字符数组。在我的情况下,需要进行哪些更改才能使您的解决方案正常工作?再次感谢... - mspoerr
2
@mspoerr:没有值为0xFF的ASCII字符。这是不可能的,因为ASCII是一个7位字符集。这也是为什么char可能有符号或无符号的原因;对于ASCII来说真的没有关系。char(0x7F)始终是正数。 - MSalters
我的意思是8位版本,无论它被称为什么(扩展ASCII或其他)。 - mspoerr
这不会将 setw(2) 和 setfill('0') 保留在字符串的第一个元素之外。 - jrwren

4
这篇答案解决了你的问题。你需要在ostream_iterator中添加一个" "作为分隔符参数,以便在字符之间添加空格。参考链接:此处

在我的快速搜索中没有发现这一点。 - Flexo
@awoodland:我只是记得以前已经回答过几乎完全相同的问题了。 - Björn Pollex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接