2012-04-25 27 views
0

我必須使用Qt框架讀取由C++應用程序編寫的二進制文件。數據由C結構構建,如下所述。字符是從C++應用程序中的QString指針寫入的。用PHP讀取C++ QString二進制數據

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

我嘗試使用下面的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將被寫入到具有(至少)長度值和字符數據的二進制文件中。您還需要考慮字符串是如何格式化的。它可能在unicode utf-16中,在這種情況下,簡單的字符會使每個字符填充零。哪裏零將取決於文件寫入的字節順序,儘管IIRC Qt總是將文件存儲在一個特定的字節序列中,而不考慮平臺,因此二進制文件是跨平臺的。

查看Qt源代碼以查看字符串是如何寫入的。也許還可以在十六進制編輯器中查看二進制文件。

如果你的二進制文件永遠只包含結構,而不必與二進制格式的一個問題是固定的,那麼你會發現事情更容易使用寫入文件的原始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(); 

我建議至少在啓動二進制文件中添加一個版本號/頭文件,以防止自己進入角落。