2013年9月27日金曜日

C++のストリームからバイナリデータ読み出し

プチはまったポイント。

std::istreamでバイナリデータを読み出すとき、get()やread()なら生データを返してくれるが、operator>>を使うと一部の特殊文字が読み飛ばされる。std::ios::binaryの効き目もないみたい。

#include <iostream>
#include <sstream>
int main() {
    std::string str("\x00\x01\x02\x03\x04\x05\x06\x07"
                    "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
                    "\x10\x11\x12\x13\x14\x15\x16\x17"
                    "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f", 32);
    std::istringstream is(str, std::ios::binary);
    for (int i = 0; i < 32; i++) {
        char c;
        is >> c;
//      c = is.get();
//      is.read(&c, 1);
        std::cout << "(" << i << ") : " << static_cast<int>(c) << std::endl;
    }
    return 0;
}

プラットフォーム依存しそうだけど、上のコードをMountain Lionで実行すると

(0) : 0
(1) : 1
(2) : 2
(3) : 3
(4) : 4
(5) : 5
(6) : 6
(7) : 7
(8) : 8
(9) : 14
(10) : 15
(11) : 16
(12) : 17
(13) : 18
(14) : 19
(15) : 20
(16) : 21
(17) : 22
(18) : 23
(19) : 24
(20) : 25
(21) : 26
(22) : 27
(23) : 28
(24) : 29
(25) : 30
(26) : 31
(27) : 31
(28) : 31
(29) : 31
(30) : 31
(31) : 31

こうなる。

0 件のコメント:

コメントを投稿