首页 > 解决方案 > 如何通过函数 longArrayToString 在 php 和 nodejs 之间获取相同的字符串

问题描述

我使用 xxtea 算法在 php 和 nodejs 之间进行通信,但是将长数组传输到 string时无法得到相同的结果。

我尝试在nodejs和php中打印结果字符串的长度,都是4,但是当我读取nodejs写入的文件时,它的长度变成了6。我曾经以十六进制模式打开两个文件,php文件显示正确的十六进制字符串 "6C 11 F0 B8",但在 nodejs 中是"6C 11 C3 B0 C2 B8"这似乎是由asciiunicode之间的差异引起的。

所以我想知道如何通过修改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

标签: phpnode.jsunicodehexascii

解决方案


下面的技术给出了.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("");
}

推荐阅读