2012-04-25 86 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(); 

我建议至少在启动二进制文件中添加一个版本号/头文件,以防止自己进入角落。