将 C++ 代码转换为 PHP?
Convert C++ code to PHP?
我正在尝试在 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 写入文件只是纯文本。
不胜感激,非常感谢!
- 您的 C++ 结构为
numbers
成员分配了 20 个字节。这意味着当你将它写入文件时,所有 20 个字节都被写入,写入不会在写入 12345.12345
后停止。另一方面,您的 PHP 代码准确地写入 $data['numbers']
中的内容并立即停止(好吧,在添加无用的 "\t"
之后)。您在文件中注意到的 "binary data" 只是内存中 12345.12345
之后那些剩余字节中的垃圾。其他领域也是如此。
- 您的 PHP 代码不会将字符串的终止 NULL 写入文件。
- 您的 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!");
}
注意:为了获得最大的兼容性,您应该 read/write 文件的每个结构成员 单独 双方的顺序一致。否则,由于 C++ 字段 padding/alignment.
,您可能会遇到问题
我正在尝试在 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 写入文件只是纯文本。
不胜感激,非常感谢!
- 您的 C++ 结构为
numbers
成员分配了 20 个字节。这意味着当你将它写入文件时,所有 20 个字节都被写入,写入不会在写入12345.12345
后停止。另一方面,您的 PHP 代码准确地写入$data['numbers']
中的内容并立即停止(好吧,在添加无用的"\t"
之后)。您在文件中注意到的 "binary data" 只是内存中12345.12345
之后那些剩余字节中的垃圾。其他领域也是如此。 - 您的 PHP 代码不会将字符串的终止 NULL 写入文件。
- 您的 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!");
}
注意:为了获得最大的兼容性,您应该 read/write 文件的每个结构成员 单独 双方的顺序一致。否则,由于 C++ 字段 padding/alignment.
,您可能会遇到问题