尝试使用我在StackOverflow中找到的示例代码...
std::string text = "¯"; // AF in HEX ASCII.
std::ostringstream result;
result << std::setw(2) << std::setfill('0') << std::hex << std::uppercase;
std::copy(text.begin(), text.end(), std::ostream_iterator<unsigned int>(result, " "));
result.str()将是'FFFFFFAF',而不仅仅是'AF'
我该怎么办?
我的文字可以包含多个字符,例如:text ='¯ABCÈ'; // AF414243C8 'convertion'之后的结果是:FFFFFFAF414243FFFFFFC8。
好吧,我用替换解决了......在这种情况下,这不是一个好习惯,但已经解决了。
if(value > 6)
{ //replace
std::string& str = stringlist2[count];
const std::string& from = "FFFFFF";
const std::string& to = "";
size_t j;
for ( ; (j = stringlist2[count].find( from )) != string::npos ; ) {
stringlist2[count].replace( j, from.length(), to );
}
}
答案 0 :(得分:1)
您没有将unsigned int
传递给operator<<
ostream_iterator
;你传递的是char
。根据您的系统,
char
可以是有符号或无符号的,如果它是有符号的8位(
最常见的情况),它不能包含0xAF(这将是175)。如果
位模式是0xAF,它实际包含的是-0x51(或-81)。哪一个
将其添加到UINT_MAX+1
,将其转换为无符号
使得一个非常大的无符号值。
您可能需要做的是先将每个字符转换为unsigned
char
。这将导致通过添加转换负值
UCHAR_MAX+1
;如果你添加0x100 +(0-x51),你将获得0xAF。作为一个
正值,所以当它转换为unsigned
(或甚至是
int
),它将保留其价值。
通常,当一个人做这种事情时,它就是一个角色 一时间,并且:
result << static_cast<int>( static_cast< unsigned char >( ch ) );
被使用。 (注意双重转换。)但是,您可以这样做 类似的东西:
std::vector< unsigned char > tmp( text.begin(), text.end() );
并使用您的电话复制tmp
。或者使用std::transform
:
struct ToUnsignedChar
{
unsigned char operator()( char ch ) const
{
return static_cast<unsigned char>( ch );
}
};
std::transform(
text.begin(),
text.end(),
std::ostream_iterator<unsigned int>( result, " " ),
ToUnsignedChar() );
(如果你有C ++ 11,这将是lambda的一个很好的候选者。)