2012-04-25 10 views
0

Qtフレームワークを使用してC++アプリケーションで作成されたバイナリファイルを読み込む必要があります。データは、後述のC構造体から構造化されています。 Charsは、C++アプリケーションのQStringポインタから書き込まれます。PHPでC++のQStringバイナリデータを読む

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

Iは、マルチバイト文字値を読み取るために、次のPHPコードを使用してみました:

// 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; 

残念ながら、結果は、所望の文字の前後にヌル(\ 0)および/または無関係な文字を含んでいます。

QStringマルチバイト配列からこれらの文字を解釈したり、PHPの標準文字列に変換する方法はありますか?

ありがとうございます。

答えて

0

QStringは(少なくとも)長さの値と文字データでバイナリに書き込まれます。また、文字列のフォーマット方法も考慮する必要があります。それはユニコードUTF-16であるかもしれません。その場合、単純な文字は各文字に0を埋め込まれます。 0がどこに書き込まれているかに依存しますが、IIRC Qtはバイナリがクロスプラットフォームなので、プラットフォームにかかわらず常に特定のエンディアンにファイルを格納します。

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(); 

少なくともバイナリファイルにバージョン番号/ヘッダーを追加することをお勧めします。

関連する問題