【问题标题】:Read C++ QString binary data with PHP使用 PHP 读取 C++ QString 二进制数据
【发布时间】:2012-05-05 19:18:20
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: php c++ qt binary


    【解决方案1】:

    将使用(至少)长度值和字符数据将 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();
    

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

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 2012-02-16
      • 1970-01-01
      相关资源
      最近更新 更多