バイトオーダー変換
前回、malloc関数で確保したメモリにSystemVerilogからアクセスできたので、C言語で画像ファイルを読み込めればそのままテストデータとして使用できるはず。C言語の標準関数では画像ファイルを読み込む関数は存在しない。検索するとそのまま使用できそうなソースも見つかるが、今回はBMPファイルのR/Wを自作してみることにする。
しかしその作成中にバイトオーダーの問題にハマってしまったため、まずバイトオーダー変換を実装した。実装時の参考URLを記載する。
バイトオーダーの変換(バイトスワップ) [クソゲ〜製作所]
・バイトオーダー変換関数
// 4バイトオーダー変換 int byteSwap(int data) { int swap = 0; // 各ループで以下手順 // 1.対象バイトが最下位に移動するよう右シフト // 2.最下位バイト以外をマスクして対象バイトを抽出 // 3.バイトオーダーを入れ替えるよう左シフト for (int i = 0; i <= 24; i += 8) swap += ((data >> i) & 0xff) << (24 - i); return swap; } // 2バイトオーダー変換 short byteSwap(short data) { short swap = 0; // 回数が異なるだけで処理は同じ for (int i = 0; i <= 8; i += 8) swap += ((data >> i) & 0xff) << (8 - i); return swap; }
・メイン関数
#include <iostream> using namespace std; int main() { short testShort = 0x1234; int testInt = 0x12345678; cout << "before byteSwap" << hex << endl; cout << "testShort = " << testShort << endl; cout << "testInt = " << testInt << endl << endl; testShort = byteSwap(testShort); testInt = byteSwap(testInt); cout << "after byteSwap" << endl; cout << "testShort = " << testShort << endl; cout << "testInt = " << testInt << endl; return 0; }
実行した結果、変換できていることを確認できた。
ところで何も考えずオーバーロードしてしまったが、C++はDPI-Cにて使用できるのだろうか??
今回の内容では大きな問題ではないが、後ほど確認はしておきたい。
[2015.11.27追記]
BMPファイル読み込み失敗の原因はバイトオーダーではなく、構造体のバイトアラインメントでした。
C言語でBMPファイルのR/W - アウトプットブログ