[英]Converting string to binary and back to string is not the same with PHP
我想出了下面的 PHP 代碼,它將二進制字符串00000010
轉換為字符串“表示”,然后我將其轉換回二進制字符串,但是它沒有返回相同的原始二進制字符串00000010
。 下面的代碼與10000010
、 11000010
完美配合……但由於某些奇怪的原因,它不適用於00000010
。 為什么?
$binary = '00000010';
echo $binary . "\n";
$temp = pack('H*',dechex(bindec($binary)));
echo str_pad(decbin(ord($temp)),8,'0',STR_PAD_LEFT);
輸出:
00000010
00100000
我知道某些二進制字符串的某些字符串“表示”不是可見/可打印的字符,但我不在乎打印這些字符。 我只想將其轉換為該字符串“表示”並返回,但它不起作用。 我做錯了什么?
編輯:
在@Rocket Hazmat 的大力幫助下,代碼開始適用於某些二進制文件,但不適用於其他二進制文件。 例如,下面的代碼看起來不起作用,它輸出0
而不是10101010
。
$binary = '10101010';
$temp = pack('C',base_convert($binary,2,16));
echo base_convert(ord($temp),16,2);
在這里使用pack()
和h*
(或h
)是您想要的。 您將其作為十六進制值讀取(從二進制轉換后),因此您希望pack
將其視為十六進制值。
$temp = pack('h', base_convert($binary, 2, 16));
問題是當您將其轉換回來時。 ord
返回一個基數為 10 的數字。 我錯誤地將其轉換為十六進制(基數 16)值:
base_convert(ord($temp), 10, 2)
不過,再次查看代碼后,我認為您甚至不需要pack()
在這里。 您正在使用ord()
,所以我們可以使用它的反面, chr()
:
$temp = chr(base_convert($binary, 2, 10));
chr()
想要一個(基數為 10)int,而不是一個十六進制值,所以讓我們使用它。
似乎有效的是以下內容:
$temp = chr(base_convert($binary, 2, 10));
echo str_pad(base_convert(ord($temp), 10, 2), 8, '0', STR_PAD_LEFT);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.