如何用十六进制字符串转换字符串?

时间:2012-09-13 12:19:13

标签: c++

  

可能重复:
  C++ convert string to hexadecimal and vice versa

尝试使用我在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 );
                        }
                    }

1 个答案:

答案 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的一个很好的候选者。)