0

我必须使用 Qt 框架读取由 C++ 应用程序编写的二进制文件。数据由 C 结构构成,如下所述。字符是从 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 标准字符串(不修改原始输入)?

谢谢你。

4

1 回答 1

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

我建议至少在启动二进制文件中添加一个版本号/标题,以防止自己陷入困境。

于 2012-04-25T12:09:01.437 回答