将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"
之后)。您在文件中注意到的"二进制数据"只是内存中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!");
}
注意:为了最大限度地兼容,您应该在两侧以一致的顺序将每个结构成员分别读/写到文件中。否则,您可能会因为C++字段填充/对齐而出现问题。
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 如何在PHPCPP库中将C++map<string,map<string>>转换为php::value?
- 如何将 ZVAL 转换为 PHP 扩展的矢量
- 将此 C 函数转换为 PHP
- 从 C++、C#、Perl 或 Java 转换为 PHP
- 将php代码转换为C(sha1算法)
- 将 vector<std::string> 转换为本机 PHP 数组
- 在Php - cpp中将Php::Object转换回c++对象
- 如何使用CURL将这样的PHP代码转换为C/ c++
- 将C++代码转换为PHP
- 将c++函数转换为PHP