PHP 進制轉換函數總結

在實踐中用到一些進制轉換函數,現將部分函數使用方法總結如下:

其中,常說的16進制字符串指的是,0-9A-Fa-f的ASCII碼字符串。

hexdec

(PHP 4, PHP 5, PHP 7)

hexdec ( string $hex_string ) : number 

返回與 hex_string 參數所表示的十六進制數等值的的十進制數。hexdec() 將一個十六進制字符串轉換爲十進制數。它會忽略它遇到的任意非十六進制的字符。

dechex

(PHP 4, PHP 5, PHP 7)

dechex — 十進制轉換爲十六進制

dechex ( int $number ) : string

返回一字符串,包含有給定 number 參數的十六進制表示。

所能轉換的最大數值爲十進制的 PHP_INT_MAX * 2 + 1 (或 -1):在 32 位平臺上是十進制的 4294967295,其 dechex() 的結果爲 ffffffff

decbin

(PHP 4, PHP 5, PHP 7)

decbin — 十進制轉換爲二進制

decbin ( int $number ) : string

返回一字符串,包含有給定 number 參數的二進制表示。所能轉換的最大數值爲十進制的 4294967295,其結果爲 32 個 1 的字符串。

decoct

(PHP 4, PHP 5, PHP 7)

decoct — 十進制轉換爲八進制

decoct ( int $number ) : string

返回一字符串,包含有給定 number 參數的八進制表示。所能轉換的最大數值爲十進制的 4294967295,其結果爲 "37777777777"。

base_convert

(PHP 4, PHP 5, PHP 7)

base_convert — 在任意進制之間轉換數字

base_convert ( string $number , int $frombase , int $tobase ) : string 

返回一字符串,包含 numbertobase 進制的表示。number 本身的進制由 frombase 指定。frombasetobase 都只能在 2 和 36 之間(包括 2 和 36)。高於十進制的數字用字母 a-z 表示,例如 a 表示 10,b 表示 11 以及 z 表示 35。

Warning  由於使用內部的 "double" 或 "float" 類型,base_convert() 的操作可能會導致大數值中的精度丟失。請參見本手冊的 浮點數 章節以便獲得更多詳細信息。

str_pad

(PHP 4 >= 4.0.1, PHP 5, PHP 7)

str_pad — 使用另一個字符串填充字符串爲指定長度

str_pad ( string $input , int $pad_length [, string $pad_string = " " [, int $pad_type = STR_PAD_RIGHT ]] ) : string

該函數返回 input 被從左端、右端或者同時兩端被填充到制定長度$pad_length後的結果。可選的 pad_type 參數的可能值爲STR_PAD_RIGHTSTR_PAD_LEFTSTR_PAD_BOTH。

例子,將一個16進制字符串$hex,從左至右,按字節兩兩異或,就最後的結果。

public static function lrc_trans($string)
{
    $LRC = 0;
	$arr = str_split($string, 2); //2個十六進制數,爲一個八位字節,str_split按指定長度分割

	foreach ($arr as $char) {
		$LRC ^= base_convert($char, 16, 10);
	}
	return str_pad(base_convert($LRC, 10, 16), 2, '0', STR_PAD_LEFT); //復原十六進制數,即2個
}

chr

(PHP 4, PHP 5, PHP 7)

chr — 返回指定的字符

將十六進制字符串轉換爲預定義的字符,


    chr(hexdec($hex));

pack

(PHP 4, PHP 5, PHP 7)

pack — 將數據打包成二進制字符串

pack ( string $format [, mixed $args [, mixed $... ]] ) : string

根據format將給地的參數打包成二進制字符串。

format字符串由格式代碼組成,後面跟着一個可選的重複參數。 重複參數可以是一個整數值或者*值來重複到輸入數據的末尾。對於a, A, h, H格式化代碼,其後的重複參數指定了給定數據將會被使用幾個字符串,對於@,其後的數字表示放置剩餘數據的絕對定位(之前的數據將會被空字符串填充),對於其他所有內容,重複數量指定消耗多少數據並將其打包到生成的二進制字符串中。

pack() 格式字符
代碼 描述
a 以NUL字節填充字符串
A 以SPACE(空格)填充字符串
h 十六進制字符串,低位在前
H 十六進制字符串,高位在前
c 有符號字符
C 無符號字符
s 有符號短整型(16位,主機字節序)
S 無符號短整型(16位,主機字節序)
n 無符號短整型(16位,大端字節序),高位在前
v 無符號短整型(16位,小端字節序),高位在後
i 有符號整型(機器相關大小字節序)
I 無符號整型(機器相關大小字節序)
l 有符號長整型(32位,主機字節序)
L 無符號長整型(32位,主機字節序)
N 無符號長整型(32位,大端字節序)
V 無符號長整型(32位,小端字節序)
q 有符號長長整型(64位,主機字節序)
Q 無符號長長整型(64位,主機字節序)
J 無符號長長整型(64位,大端字節序)
P 無符號長長整型(64位,小端字節序)
f 單精度浮點型(機器相關大小)
g 單精度浮點型(機器相關大小,小端字節序)
G 單精度浮點型(機器相關大小,大端字節序)
d 雙精度浮點型(機器相關大小)
e 雙精度浮點型(機器相關大小,小端字節序)
E 雙精度浮點型(機器相關大小,大端字節序)
x NUL字節
X 回退已字節
Z 以NUL字節填充字符串空白(PHP 5.5中新加入的)
@ NUL填充到絕對位置

args 爲指定格式的數

理解:

echo pack("v*", '41');  ------ 輸出),“v*”表示參數是十進制,即結果爲ASCII碼值41的符號")"。

echo pack("H*", '41');  ------ 輸出A,“H*”表示參數是十六進制即0x41(十進制數65),即結果爲ASCII碼值65的字符"A"。

echo pack("c*", '41'); ------ 輸出),“c*”表示參數是十進制,即結果爲ASCII碼值41的符號")"。

echo bin2hex(pack("H*", '41')); ------ 輸出41,“H*”表示參數是十六進制即0x41,即結果輸出十六進制字符串“41”。

echo bin2hex(pack("v*", '4')); ------ 輸出0400

echo bin2hex(pack("v*", '1')); ------ 輸出0100

echo bin2hex(pack("v*", '41')); ------ 輸出2900,“v*”表示參數是十進制,內存中保存爲0x2900(16位,即2個字節),所以結果爲“2900”。

總結,pack函數返回字符,其中格式指定了參數是十進制還是十六進制數,將參數轉換爲16進制數(結果的保存內容),再結合格式指定的保存位數,最終確定結果在內存中的保存形式。而bin2hex可以直接輸出該數再內存中的保存樣式。

unpack

(PHP 4, PHP 5, PHP 7)

unpack — Unpack data from binary string

說明

unpack ( string $format , string $data [, int $offset = 0 ] ) : array

<?php
$binarydata = "\x04\x00\xa0\x00";
$array = unpack("cchars/nint", $binarydata);
print_r($array);
?>

輸出:

Array
(
    [chars] => 4   # "\x04"
    [int] => 160   # "\x00\xa0"
)
<?php
$binarydata = "\x04\x00\xa0\x00";
$array = unpack("c2chars/nint", $binarydata);
print_r($array);
?> 

輸出:

Array
(
    [chars1] => 4 # "\x04"
    [chars2] => 0 # "\x00"
    [int] => 40960 # "\xa0\x00", 即0xA00 = 10*16*16*16 = 40960, ‘n’表示高位在前,‘v’表示高位在後
)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章