0

Qt フレームワークを使用して C++ アプリで記述されたバイナリ ファイルを読み取る必要があります。以下に説明するように、データは C 構造体から構造化されます。文字は、C++ アプリの QString ポインターから書き込まれます。

struct panelSystem{
    char ipAddress[16];
    char netMask[16];
    char gateway[16];
    char paddingBytes[128];
};

次のPHPコードを使用して、マルチバイトのchar値を読み取ってみました:

    // Where: $length is a defined number (16 or 128 in this case)
    //        $data is a binary string read from the binary file

    $var = substr($data, $currentOffset, $length);
    $currentOffset += $length;    // Increment offset by X bytes
    $var = trim(str_replace("\0", "\n", $var));
    $var = unpack("C*", $var);
    $char = '';
    foreach ($var as $letter) {
        $char .= chr($letter);
    }
    $var = $char;

残念ながら、結果には、目的の文字の前後に null (\0) および/または無関係な文字が含まれています。

これらの文字を QString マルチバイト配列から PHP 標準文字列に (元の入力を変更せずに) 解釈または変換する方法はありますか?

ありがとうございました。

4

1 に答える 1

0

QString は、(少なくとも) 長さの値と文字データと共にバイナリに書き込まれます。また、文字列のフォーマット方法も考慮する必要があります。Unicode utf-16 である可能性があり、その場合、単純な文字では各文字がゼロで埋められます。ゼロがどこに置かれるかは、ファイルが書き込まれるエンディアンによって異なりますが、IIRC Qt はプラットフォームに関係なく、常に 1 つの特定のエンディアンでファイルを保存するため、バイナリはクロスプラットフォームになります。

Qt のソース コードを見て、文字列がどのように記述されているかを確認してください。16 進エディタでバイナリ ファイルを確認することもできます。

バイナリ ファイルに構造体しか含まれておらず、バイナリ形式が修正されても問題がない場合は、生の IO を使用してファイルを書き込む方がはるかに簡単であることがわかります。

struct panelSystem{
    char ipAddress[16];
    char netMask[16];
    char gateway[16];
    char paddingBytes[128];

    void write(QDataStream& ds) {
        ds.writeRawData(ipAddress, sizeof(ipAddress));
        ds.writeRawData(netMask, sizeof(netMask));
        ds.writeRawData(gateway, sizeof(gateway));
        ds.writeRawData(paddingBytes, sizeof(paddingBytes));
    }
};

//...

    panelSystem p;
    GetPanelSystemData(&p);

    QFile file("c:\\work\\test\\testbin.bin");
    if (file.open(QIODevice::Truncate | QIODevice::WriteOnly)) {
        QDataStream ds(&file);
        p.write(ds);        
    }
    file.close();

少なくともバージョン番号/ヘッダーを開始バイナリ ファイルに追加して、追い詰められないようにすることをお勧めします。

于 2012-04-25T12:09:01.437 に答える