你可以把一個(單字節字符)串的作爲鹼-256編碼的數,其中「\ X00」表示0,「」(空間,即,「\ X20」)代表32等直到「\ XFF」,它代表255
只與數字0-9的表示可以通過改變表示以基座10
注意,「base64編碼」實際上不是一個base conversion簡單地完成。 base64將輸入分成3個字節(24位)的組,並分別在這些組上進行基本轉換。這很有效,因爲具有24位的數字可以用基數64中的四位數來表示(2^24 = 64^4)。
這或多或少是el.pescado所做的 - 他將輸入數據分成8位,然後將數字轉換爲10位數。然而,這種技術相對於base 64編碼有一個缺點 - 它不能正確對齊與字節邊界。要用8位(0-255無符號數)表示數字,我們需要以10爲底數的三位數字。但是,最左邊的數字比其他數字少。它可以是0,1或2(對於無符號數字)。
基數10中的數字存儲日誌(10)/ log(2)位。無論您選擇的塊大小如何,您都無法將這些表示與8位字節對齊(在前面段落中描述的「對齊」意義上)。因此,最緊湊的表示形式是基本轉換(您可以看到它就像是隻有一個大塊的「基本編碼」)。
以下是bcmath的示例。
bcscale(0);
function base256ToBase10(string $string) {
//argument is little-endian
$result = "0";
for ($i = strlen($string)-1; $i >= 0; $i--) {
$result = bcadd($result,
bcmul(ord($string[$i]), bcpow(256, $i)));
}
return $result;
}
function base10ToBase256(string $number) {
$result = "";
$n = $number;
do {
$remainder = bcmod($n, 256);
$n = bcdiv($n, 256);
$result .= chr($remainder);
} while ($n > 0);
return $result;
}
對於
$string = "Mary had a little lamb";
$base10 = base256ToBase10($string);
echo $base10,"\n";
$base256 = base10ToBase256($base10);
echo $base256;
我們得到
36826012939234118013885831603834892771924668323094861
Mary had a little lamb
由於每個數字只能編碼log(10)/log(2)=~3.32193
位預期數量往往是140% longer(不是200%更長的時間,如將與埃爾.pescado的回答)。
字符串只是一組映射到人類可讀字符的數字。告訴我們更多關於爲什麼你想要做這樣的事情,你可能會得到一個很好的答案。你想能夠將數字轉換回原始字符串嗎?否則,哈希函數可能就足夠了。 – 2010-06-05 21:18:52
@William在我當前的情況下,我想將包含數字和字母(內部ID,看起來醜陋)的16個字符的URL標識符轉換爲「僅用於數字」表示形式,以便更易於理解,用作錨點訪問CMS中的不同內容塊。 – 2010-06-05 21:20:05
@Pekka:你的虛構結果似乎有點樂觀,不是嗎?它比原始字符串短一個字符! ;-) – 2010-06-05 21:24:55