php - 如何通过函数 longArrayToString 在 php 和 nodejs 之间获取相同的字符串
问题描述
我使用 xxtea 算法在 php 和 nodejs 之间进行通信,但是将长数组传输到 string时无法得到相同的结果。
我尝试在nodejs和php中打印结果字符串的长度,都是4,但是当我读取nodejs写入的文件时,它的长度变成了6。我曾经以十六进制模式打开两个文件,php文件显示正确的十六进制字符串 "6C 11 F0 B8",但在 nodejs 中是"6C 11 C3 B0 C2 B8"。这似乎是由ascii和unicode之间的差异引起的。
所以我想知道如何通过修改nodejs中的longArrayToString函数来获得它们之间相同的结果
<?php
$a = [-1192226452];
$b = long2str($a);
var_dump($b);
file_put_contents('./a.txt', $b);
function long2str($v) {
$len = count($v);
$n = ($len - 1) << 2;
$s = array();
for ($i = 0; $i < $len; $i++) {
var_dump($v[$i]);
$s[$i] = pack("V", $v[$i]);
for($j = 0; $j < strlen($s[$i]); $j ++) {
var_dump(ord($s[$i][$j]));
}
}
return join('', $s);
}
const fs = require('fs');
a = [-1192226452];
b = longArrayToString(a);
console.log(b);
fs.writeFile('./b.txt', b, function(error){});
function longArrayToString(data) {
let length = data.length
, n = (length - 1) << 2;
for (let i = 0; i < length; ++i) {
console.log(data[i]);
data[i] = String.fromCharCode(
data[i] & 0xff,
data[i] >>> 8 & 0xff,
data[i] >>> 16 & 0xff,
data[i] >>> 24 & 0xff
);
for(j = 0; j < data[i].length; j ++)
{
console.log(data[i][j].charCodeAt());
}
}
return data.join("");
}
php控制台结果:
int(-1192226452)int(108)int(17)int(240)int(184)字符串(4)“l�”
nodejs控制台结果:
108 17 240 184 lð¸
十六进制模式下的php文件:
6C 11 F0 B8
十六进制模式下的nodejs文件:
C 11 C3 B0 C2 B8
解决方案
下面的技术给出了.txt
带有字节(十六进制)的文件:6C 11 F0 B8
.
该.toString(16)
部分将您的 int 值转换为十六进制字符串(例如:)int 108 == hex 6C
。
因此,只需使用 . 将每个十六进制文本附加到最终/输出字符串即可+=
。
1)创建一个临时变量来保存你的最终十六进制字符串。例如: var num_as_HexStr = "";
2) 第二个 For 循环执行附加:num_as_HexStr += (data[i][j].charCodeAt()).toString(16);
3)现在您可以写入num_as_HexStr
(而不是写入b
文件)。预期的十六进制将是正确的。
const fs = require('fs');
var num_as_HexStr = "";
a = [-1192226452];
b = longArrayToString(a);
console.log("var b is: " + b);
console.log("var num_as_HexStr is: " + num_as_HexStr);
fs.writeFile('./b.txt', num_as_HexStr, function(error){});
function longArrayToString(data) {
let length = data.length, n = (length - 1) << 2;
console.log("string check 1");
for (let i = 0; i < length; ++i) {
console.log(data[i]);
data[i] = String.fromCharCode(
data[i] & 0xff,
data[i] >>> 8 & 0xff,
data[i] >>> 16 & 0xff,
data[i] >>> 24 & 0xff
);
console.log("string check 2");
for(j = 0; j < data[i].length; j ++)
{
console.log(data[i][j].charCodeAt());
num_as_HexStr += (data[i][j].charCodeAt()).toString(16);
//console.log("hex string: " + num_as_HexStr);
}
}
return data.join("");
}
推荐阅读
- hadoop - HBase 表二级索引问题
- python - 预期的浏览器二进制位置,但无法在默认位置找到二进制文件,没有使用 GeckoDriver 提供的“moz:firefoxOptions.binary”功能
- python - 如何在 Flask render_template 中为变量渲染 html
- python - pytorch Dataloader,bertModel 出现暗淡错误
- java - Java 日志记录问题。它行不通。找不到原因
- c++ - 运算符重载、右值、C++
- python - 奇数和偶数
- c# - 确定类是否具有特定泛型参数类型的泛型祖先
- python - Vaex:如何向 Vaem DataFrame 添加/追加行
- xml - 什么 XSLT 复制 XML 文件,删除一个属性并修改另一个属性的值?