fc2ブログ

Entries

Boost Vault Endian

タグ: C++ Boost

構造体をそっくりそのままバイナリデータとして読み込んだり保存しなければならないときに重宝するライブラリ。
メンバ変数をこのライブラリの型で表すだけで、保存先データと実行環境のエンディアンの違いを吸収する。

試しにlzhファイルのヘッダを読んでみる。

#include <iostream>
#include <fstream>
#include <string>
#include <boost/integer/endian.hpp>

using namespace boost::integer;

#pragma pack(push, 1) // 念のため
struct lha2_header
{
	little16_t hedsize;
	little8_t method[5];
	little32_t packed;
	little32_t original;
	little32_t time;
	little8_t attrib;
	little8_t level;
	little16_t filecrc;
	little8_t OSmark;
};
#pragma pack(pop)

int main(int argc, char** argv)
{
	if(argc < 0)
		return 1;
	
	std::ifstream ifs(argv[1],std::ios::in | std::ios::binary);
	
	lha2_header h;
	ifs.read(reinterpret_cast<char*>(&h), sizeof(h));

	std::cout << "hedsize:" << static_cast<unsigned int>(h.hedsize) << std::endl;
	std::cout << "method:" << std::string(reinterpret_cast<char*>(h.method), 5) << std::endl;
	std::cout << "OSmark:" << static_cast<char>(h.OSmark) << std::endl;

	return 0;
}

実行結果


hedsize:48
method:-lhd-
OSmark:M

……ってIntel Macじゃ試しになってないな。

スポンサーサイト



コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/13-4f28c367
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索