В 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