在實踐中用到一些進制轉換函數,現將部分函數使用方法總結如下:
其中,常說的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
返回一字符串,包含 number
以 tobase
進制的表示。number
本身的進制由 frombase
指定。frombase
和 tobase
都只能在 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_RIGHT
,STR_PAD_LEFT
或 STR_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格式化代碼,其後的重複參數指定了給定數據將會被使用幾個字符串,對於@,其後的數字表示放置剩餘數據的絕對定位(之前的數據將會被空字符串填充),對於其他所有內容,重複數量指定消耗多少數據並將其打包到生成的二進制字符串中。
代碼 | 描述 |
---|---|
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’表示高位在後
)