PHP функция в node js - PullRequest
0 голосов
/ 08 мая 2020

Пытался преобразовать следующую функцию PHP в Node.js, но обе показывают разные результаты. Функция out of node.js должна быть равна функции PHP. Ниже приведен код, который я пробовал. Я также добавил значение шестнадцатеричного дампа.

PHP

function hextobin() {

    $hexString = md5(''); //d41d8cd98f00b204e9800998ecf8427e
    $length = strlen($hexString);
    $binString = "";
    $count = 0;
    while ($count < $length) {
        $subString = substr($hexString, $count, 2);
        $packedString = pack("H*", $subString);

        if ($count == 0) {
            $binString = $packedString;
        } else {
            $binString .= $packedString;
        }

        $count += 2;
    }
    return $binString;
}

Output = ��ُ�� ���B~

Hexdump -C value of above output = 

00000000  ef bf bd 1d ef bf bd d9  8f ef bf bd 04 ef bf bd  |................|
00000010  20 ef bf bd ef bf bd ef  bf bd 42 7e 0a           | .........B~.|
0000001d

Node.JS

exports.hex2bin = (key) => {
    const m = crypto.createHash('md5');
    m.update(key);
    const hexString = m.digest('hex');
    let binString ="";
    let length = hexString.length;
    let count = 0;

    while (count < length) {

        const sub = hexString.substr(count, 2);
        let packedString =  Buffer.from(sub, "hex");

        if (count === 0) {
            binString = packedString;
        } else {
            binString += packedString;
        }

        count += 2;
    }

    return binString;
};

Output = ������� ���B~

Hexdump -C value of above output = 

00000000  ef bf bd 1d ef bf bd ef  bf bd ef bf bd ef bf bd  |................|
00000010  04 ef bf bd ef bf bd 20  ef bf bd ef bf bd ef bf  |....... ........|
00000020  bd 42 7e 0a                                       |.B~.|
00000024

Любая помощь будет оценена по достоинству.

1 Ответ

2 голосов
/ 08 мая 2020

В PHP строка не имеет внутренней кодировки c. Это просто серия байтов. В Javascript строках используется кодировка UTF-16.

Чтобы иметь дело с чем-то эквивалентным строке php в узле, класс Buffer уже представляет собой массив 8-битных байтов без знака. См. руководство узла по буферу для этой цитаты:

В Node.js объекты буфера используются для представления двоичных данных в виде последовательности байтов. Многие Node.js API, например потоки и операции файловой системы, поддерживают буферы, поскольку взаимодействие с операционной системой или другими процессами обычно всегда происходит в терминах двоичных данных.

Класс Buffer является подклассом Uint8Array класс, встроенный в язык JavaScript. Поддерживается ряд дополнительных методов, охватывающих дополнительные варианты использования. Node.js API-интерфейсы принимают простые массивы Uint8Arrays везде, где также поддерживаются буферы.

Используемая служебная функция Buffer.from будет считывать всю шестнадцатеричную строку в один go вместо преобразования каждой пары шестнадцатеричных

Подтверждение концепции:

let hex2bin = () => {
    let hexString = 'd41d8cd98f00b204e9800998ecf8427e';
    let packedString =  Buffer.from(hexString, "hex");
    return packedString;
};

process.stdout.write(hex2bin());

hexdump

$ node test.js | hexdump -C
00000000  d4 1d 8c d9 8f 00 b2 04  e9 80 09 98 ec f8 42 7e  |..............B~|
00000010

PHP Скрипт (на основе вашего исходного кода):

function hextobin() {
    //
    //$hexString = 'd41d8cd98f00b204e9800998ecf8427e';
    $hexString = md5('');
    $length = strlen($hexString);
    $binString = "";
    $count = 0;
    while ($count < $length) {
        $subString = substr($hexString, $count, 2);
        $packedString = pack("H*", $subString);

        if ($count == 0) {
            $binString = $packedString;
        } else {
            $binString .= $packedString;
        }

        $count += 2;
    }
    return $binString;
}
echo hextobin();

hexdump

$ php -f hex2bin.php | hexdump -C
00000000  d4 1d 8c d9 8f 00 b2 04  e9 80 09 98 ec f8 42 7e  |..............B~|
00000010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...