2017-07-19 180 views
5

對於PHP而言,我需要將字節數組轉換爲可用於PHP函數的字符串; hash_hmac("sha256", $payload, $key, true)將字節數組轉換爲PHP中的字符串

$key將起源於Guid,例如{6fccde28-de32-4c0d-a642-7f0c601d1776},它被轉換爲字節數組。由於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而不丟失數據?

回答

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; 
} 
+0

我已經這樣做了,但是沒有正確的字節順序$ keyBytes將會出錯...... – SorenJorgensen

+0

;-)在2分鐘前看到它。謝謝... – SorenJorgensen

1

可以使用Chr函數在PHP

http://php.net/manual/en/function.chr.php

CHR接收輸入的int並返回一個corrispondent的ASCII字符。

$strings = array_map("chr", $bytes); 
$string = implode(" ", $strings); 

我希望我是有幫助的

+0

我已經做到這一點,但是不會array_map「公正」產生另陣列? 結果呢還是要拼成一個字符串? – SorenJorgensen

+0

您可以使用implode函數來獲取字符串作爲結果。 $ strings = array_map(「chr」,$ bytes); $ string = implode(「」,$ strings); –