【问题标题】:How to convert a string in hexadecimal string? [duplicate]如何将字符串转换为十六进制字符串? [复制]
【发布时间】:2012-09-06 12:43:56
【问题描述】:

可能重复:
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 “转换”后的结果是: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 );
                        }
                    }

【问题讨论】:

  • char 转换为int 时看起来像符号扩展(0xaf 大于0x7f,因此为负数)。
  • 是的,我认为 Hristo 是对的。这里的错误假设是字符是 ASCII 编码的(因为 ASCII 的范围仅从 0x00x7f
  • 它是扩展的 ASCII。 ascii-code.com
  • @GuilhermeQuelhos:没有“扩展 ASCII”这样的东西。如果您使用超过标准化的 127 个字符代码(该网站提到它是 ISO-8859-1,但还有其他代码),则需要指定编码

标签: c++


【解决方案1】:

您没有将unsigned int 传递给由调用的operator&lt;&lt; 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 候选者。)

【讨论】:

    猜你喜欢
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 2019-07-27
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    相关资源
    最近更新 更多