2017-03-20 5 views
1

私はC++に慣れていないので、私には負担してください...std :: hexが期待どおりに動作しない

2バイトがデバイスから読み込まれ、バッファに入ります。 これが印刷されます。

以下のコードは、文字列を返すことになっている「0x204D」 しかし、ヘクス中のSOヘクスがASCIIにデコードされていない30 78 20 4D

ある「0X M」を返します。

void vito_unit::decodeAsRaw(unsigned char *buffer, int bufferLen) 
{ 
    std::stringstream *decodedClearText; 
    decodedClearText = new std::stringstream; 

    *decodedClearText << "0x" << std::hex; 

    for (int i=0; i<bufferLen; i++) { 
      *decodedClearText << buffer[i]; 
    } 
    setValue(decodedClearText->str()); 
} 

どうすればよいですか?

+2

トピックから:あなたは 'decodedClearText'を構築するためにnewを使用している理由は何ですか? – PiotrNycz

+1

@PiotrNyczいいえ、私は明らかに理解できない言語で他の人のコードを修正しようとしています;-) –

+0

@BoPersson:コメント欄に答えないでください。 –

答えて

2

buffer[i]は、タイプがunsigned charであるため、16進表現ではなく文字として出力されます。それを避けるために値をunsigned intにキャストすることができます。

void vito_unit::decodeAsRaw(unsigned char *buffer, int bufferLen) 
{ 
    std::stringstream *decodedClearText; 
    decodedClearText = new std::stringstream; 

    *decodedClearText << "0x" << std::hex; 

    for (int i=0; i<bufferLen; i++) { 
      *decodedClearText << (unsigned int) buffer[i]; 
    } 
    setValue(decodedClearText->str()); 
} 
2

私が必要としていたヒントです。

for (int i=0; i<bufferLen; i++) { 
     *decodedClearText << (int)buffer[i]; 
} 

でした。

+1

コードを変更している間に 'new'を取り除いてください。 –

+0

...私が以下にコメントしたように、あなたは本当に 'std :: setw(2)'をすべての文字でストリーミングしなければなりません。そうでなければ '0x0102'ではなく' 0x12'で終了します! –

2

これは、std::hexとは関係ありません。

[signed/unsigned] charをストリーミングすると、通常はcharであるため、そのASCII表現が使用されます。

の代わりに、intに変換してストリームできます。次に、の数字を16進表記で表示する機能(つまり、std::hex)がトリガーされます。

また、そのメモリリークや不要な動的割り当てを修正する必要があります。

void vito_unit::decodeAsRaw(unsigned char const* const buffer, int const bufferLen) 
{ 
    std::stringstream decodedClearText; 
    decodedClearText << "0x" << std::hex; 

    for (int i = 0; i < bufferLen; i++) { 
     decodedClearText << +buffer[i]; 
    } 

    setValue(decodedClearText.str()); 
} 

「+」単項はintに不可欠プロモーションを行います。

+0

これは0x200x4dを出力しましたが、orifinal decodedClearText << "0x" << std :: hex;他の変更は機能します。しかし、一度だけ実行されるので、ループもデーモン化もありません。 –

+0

@LeifNeland:いいところです。 'showbase'は悪い考えです。 –

+0

単項' + 'を使ってintに変換すると、私は賢明なものになります。静的キャストを使うか、ローカルintに代入するだけです。おそらく 'setw(2) 'も必要です。それ以外の場合は "0x01020304"の代わりに、 "0x1234"になります。 –

関連する問題