1

私は宿題の問題に取り組んでおり、バイナリファイルから印刷しています。検索したところ、私の問題は符号拡張の問題であることがわかりました。

cでは、正しいアクションは(unsigned char)にキャストすることです。

私はこの解決策を試しましたが、coutでは機能しません

(符号なし)を使用した出力は次のとおりです。

4D 5A FFFFFF90 00 03 00 00 00 04 00 00 00 FFFFFFFF FFFFFFFF 00 00 

(unsigned char)を使用した出力は次のとおりです。

0M 0Z 0ê 0� 0 0� 0� 0� 0 0� 0� 0� 0ˇ 0ˇ 0� 0� 

どんなガイダンスも最も役に立ちます。

コードは次のとおりです。

void ListHex(ifstream &inFile)
{
    // declare variables
    char buf[NUMCHAR];
    unsigned char bchar;

    while(!inFile.eof())
    {
       inFile.read(buf,NUMCHAR);
       for (int count = 0; count < inFile.gcount(); ++count)
       {

        cout << setfill('0') << setw(2) << uppercase << hex << 
           (unsigned)buf[count] << ' ';
       }
       cout << '\n';
   }
}
4

4 に答える 4

2

どうですかcout <<setfill('0') << setw(2) << uppercase << hex << (0xFF & buf[count])

于 2013-03-01T19:35:41.337 に答える
1
void ListHex(std::istream& inFile) {
    // declare variables
    char c;
    while(inFile >> c) {
        std::cout << std::setw(2) << std::hex 
                  << static_cast<int>(c);
    }
}

この文字ごとに行うことをお勧めします。その理由は、解釈的なint変換を処理するときに、考えたくないあらゆる種類のエンディアンの問題があるためです。とにかく、std::ifstreamは文字をバッファリングします(OSも同様です)。

より一般的なものとして、ファイルストリームをどのように取り込むかに注目してください。これにより、、、およびを含むstd::istream任意のタイプを渡すことができます。istreamstd::istringstreamstd::cinstd::ifstream

例えば:

 ListHex(std::cin); 

 std::istringstream iss("hello world!");
 ListHex(iss);

ユーザー入力を16進数にします。

編集

バッファを使用する

void ListHex(std::istream& inFile) {
    // declare variables

    char arr[NUMCHAR];

    while(inFile.read(arr, NUMCHAR)) {
        for(std::size_t i=0; i!=NUMCHAR; ++i) {
            std::cout << std::setw(2) << std::hex 
                      << static_cast<int>(arr[i]);
        }
    }
}
于 2013-03-01T19:35:24.237 に答える
0

上位ビットをマスクすることにより、符号拡張を取り除くことができます。

(((unsigned) buf[count)) & 0xff)
于 2013-03-01T19:38:29.443 に答える
0

std :: coutは、unsignedcharを整数ではなく文字として出力します。ここでは、次の2つのキャストを実行できます。

static_cast <int> (static_cast <unsigned char> (buf[count]))

または、unsignedcharバッファーと単一のキャストを使用します。

void ListHext(ifstream& inFile)
{
    unsigned char buf[NUMCHAR];
    while (inFile.read(reinterpret_cast <char*> (&buf[0]), NUMCHAR))
    {
        for (int i=0; i < NUMCHAR; ++i)
            cout << ... << static_cast <int> (buf[i]) << ' ';
        cout << endl;
    }
}

編集:マスクは特定の文字サイズを想定しているため、ここでは使用しないでください。以下は、CHAR_BITが8の場合にのみ同等です。

// bad examples
x & 0xFF // note - implicit int conversion
static_cast <int> (x) & 0xFF // note - explicit int conversion

// good example
static_cast <int> (static_cast <unsigned char> (x))
于 2013-03-01T19:43:13.717 に答える