アウトプットブログ

勉強したことをまとめていきます。

バイトオーダー変換

前回、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;
}

実行した結果、変換できていることを確認できた。
f:id:HappyField:20151126001143p:plain

ところで何も考えずオーバーロードしてしまったが、C++はDPI-Cにて使用できるのだろうか??
今回の内容では大きな問題ではないが、後ほど確認はしておきたい。

[2015.11.27追記]
BMPファイル読み込み失敗の原因はバイトオーダーではなく、構造体のバイトアラインメントでした。
C言語でBMPファイルのR/W - アウトプットブログ