将C++代码转换为PHP

Convert C++ code to PHP?

本文关键字:PHP 转换 代码 C++      更新时间:2023-10-16

我正在尝试用php编写一个结构,我知道php中没有这样的东西,但至少让它以某种方式工作。。。

C++:

 // The struct
    typedef struct data
    {
        char numbers[20];
        char numbers2[50];
        char number3[6];
        char sometext[100];
    }data_t;
    data_t config;
    char numbers[20] = "12345.12345";
    char numbers3[6] = "12345";
    char sometext[100] = "asdsadsad";
    // Storing into struct
    strcpy_s(config.numbers, numbers);
    strcpy_s(config.numbers3, numbers3);
    strcpy_s(config.sometext, sometext);
    // Serializing struct to test.dat
    ofstream output_file("test.dat", ios::binary);
    output_file.write((char*)&config, sizeof(config));
    output_file.close();
    // Reading from it
    ifstream input_file("test.dat", ios::binary);
    input_file.read((char*)&master, sizeof(master));
    cout << "NUMBERS : " << master.numbers << endl;
    cout << "NUMBERS3 : " << master.numbers3 << endl;
    cout << "SOMETEXT : " << master.sometext << endl;
    cout << endl << endl;

现在用c++存储在结构中,然后读取它就可以了,但我想通过php存储在那个文件中,然后从c++读取它,所以我有:

PHP:

$data = Array();
$data['numbers'] = "12345.12345";
$data['numbers3'] = "12345";
$data['sometext'] = "abcdfghs";
$fp=fopen("test.dat","wb") or die("Stop! i kill you...");
foreach($data as $key => $value){
echo 'written:'.$value;
fwrite($fp,$value."t");
}

现在发生的是:

NUMBERS : 12345.12345  12345   abcdfghs
NUMBERS3 :
SOMETEXT :

正如您所看到的,这并不好,我还注意到从c++(包含二进制数据)写入文件时的差异,而从php写入文件只是纯文本。

我们会感谢您的帮助,非常感谢!

  1. 您的C++结构为numbers成员分配20个字节。这意味着,当您将其写入文件时,所有20个字节都被写入,写入不会在写入12345.12345之后停止。另一方面,您的PHP代码完全写入$data['numbers']中的内容,并立即停止(好吧,在添加了一个无用的"t"之后)。您在文件中注意到的"二进制数据"只是内存中12345.12345之后剩余字节中的垃圾。其他领域也是如此
  2. PHP代码不会将字符串的终止NULL写入文件
  3. 您的PHP代码不会将numbers2成员写入该文件

您需要确保PHP代码写入终止NULL,将输出填充到与C++结构中字段相同的大小,并以与C++结构相同的顺序输出字段。您可以使用pack()进行以下操作:

<?php
$data = array();
$data['numbers'] = "12345.12345";
$data['numbers2'] = '';
$data['numbers3'] = "12345";
$data['sometext'] = "abcdfghs";
$packed = pack('a20a50a6a100', $data['numbers'], $data['numbers2'], $data['numbers3'], $data['sometext']);
$written = file_put_contents("test.dat", $packed);
if($written === false) {
  throw new RuntimeException("Failed to write data to file!");
} else if($written !== strlen($packed)) {
  throw new RuntimeException("Writing to file was not complete!");
}

注意:为了最大限度地兼容,您应该在两侧以一致的顺序将每个结构成员分别读/写到文件中。否则,您可能会因为C++字段填充/对齐而出现问题。