在PHP中将字节数组转换为字符串

5

作为 PHP 新手,我需要将字节数组转换为字符串以便在 PHP 函数中使用;hash_hmac("sha256", $payload, $key, true)

$key 将来自一个 GUID,例如 {6fccde28-de32-4c0d-a642-7f0c601d1776},该 GUID 转换为字节数组。由于 hash_hmac 函数需要一个字符串作为数据和密钥,因此我需要将此字节数组转换为字符串而不会因不可打印字符而丢失信息。

我正在使用以下 PHP 代码:

function guidToBytes($guid) {
    $guid_byte_order = [3,2,1,0,5,4,6,7,8,9,10,11,12,13,14,15];
    $guid = preg_replace("/[^a-zA-Z0-9]+/", "", $guid);
    $result = [];
    for($i=0;$i<16;$i++)
        $result[] = hexdec(substr($guid, 2 * $guid_byte_order[$i], 2));
    return $result;
}

$payload = utf8_encode("Some data string");
$keyBytes = guidToBytes("6fccde28-de32-4c0d-a642-7f0c601d1776");
$key = implode(array_map("chr", $keyBytes));

$hash = hash_hmac("sha256", $payload, $key, true);
$result = base64_encode($hash);

C#中等效的代码:

var g = Guid.Parse("6fccde28-de32-4c0d-a642-7f0c601d1776");
var key = g.ToByteArray();
var data = "Some data string";
var payload = Encoding.UTF8.GetBytes(data);

using(var ha = new HMACSHA256(key)) {
   var hash = ha.ComputeHash(payload);
   var result = Convert.ToBase64String(hash);
}

将值替换为$key将在两种语言中产生相同的base64输出,留下$key是错误/不同的东西。

那么,如何将$keyBytes转换为$key而不会丢失数据?

2个回答

2
你可以在PHP中使用chr函数。
chr函数接收一个整数作为输入,并返回相应的ASCII字符。 http://php.net/manual/en/function.chr.php
$strings = array_map("chr", $bytes);
$string = implode(" ", $strings);

I hope I was helpful


我已经这样做了,但是array_map会“只是”产生另一个数组吗?结果仍然需要组合成一个字符串吗? - SorenJorgensen
你可以使用implode函数来获取字符串作为结果。 $strings = array_map("chr", $bytes); $string = implode(" ", $strings); - Alfonso Piscitelli

0
请尝试使用此函数将 GUID 转换为二进制字符串:
function guidToBytes($guid) {
    $guid_byte_order = [3, 2, 1, 0, 5, 4, 7, 6, 8, 9, 10, 11, 12, 13, 14, 15];
    $guid = preg_replace("/[^a-zA-Z0-9]+/", "", $guid);
    $result = [];
    foreach ($guid_byte_order as $offset) {
        $result[] = hexdec(substr($guid, 2 * $offset, 2));
    }
    return $result;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接