-1

重複の可能性:
C++ は文字列を 16 進数に、またはその逆に変換します

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() は、単に「AF」ではなく「FFFFFFAF」になります

私に何ができる?

次のように、テキストに複数の文字を含めることができます。// 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

あなたは呼び出された by に渡しunsigned intていません。を渡しています。システムによっては、 符号付きまたは符号なしの場合があり、符号付きで 8 ビット (最も一般的なケース) の場合、0xAF (175) を含めることはできません。ビット パターンが 0xAF の場合、実際に含まれているのは -0x51 (または -81) です。これは に追加することで符号なしに変換され、非常に大きな符号なしの値になります。operator<<ostream_iteratorcharcharUINT_MAX+1

おそらく行う必要があるのは、各文字をunsigned char最初に変換することです。これにより、負の値が追加されて変換され UCHAR_MAX+1ます。0x100 + (0-x51) を追加すると、0xAF が得られます。正の値であるため、 にunsigned(または に int) 変換されても、その値は保持されます。

通常、この種のことを行うときは、一度に 1 文字で、次のようになります。

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 を使用している場合、これはラムダの良い候補になります。)

于 2012-09-13T12:39:22.423 に答える