-1

可能重复:
C++ 将字符串转换为十六进制,反之亦然

尝试我在 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 “转换”后的结果是: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 );
                        }
                    }
4

1 回答 1

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 候选者。)

于 2012-09-13T12:39:22.423 回答