[英]PHP unserialized integer from 64-bit to 32-bit
我一直在嘗試在32位服務器上反序列化在64位服務器上序列化的對象。 我已將我的問題隔離到對象中的整數。 這是對問題的一個小的再現。
在64位計算機上:
$i = serialize('20110510134021'); //i:20110510134021;
在32位機器上:
$i = unserialize('i:20110510134021;');
給出錯誤
Notice: unserialize(): Error at offset 0 of 16 bytes
現在我明白這些序列化方法不應該用於跨系統數據傳輸。 但是,我們只是嘗試將數據遷移到另一個系統,而不是主動用於傳輸。 這是一次性的事情。
我認為這可能是由於整數溢出,但即使在32位服務器上,我也可以做類似的事情
$i = 20110510134021;
echo $i;
它會工作正常。 我猜測PHP整數類型可以縮放到某種雙重類型或類似的東西。 但是為什么它在反序列化時不這樣做呢?
如何反序列化這些對象? 如果我不能,有沒有辦法將它們轉換成其他東西? 最后,有沒有人在PHP本身編寫反序列化方法? 或者有協議的細節? 我可以使用它,並為這些整數有一個自定義的情況。
謝謝。
注意:我無權訪問原始數據,只能訪問序列化結果。
32位系統的最大整數是4294967296
; $i = 20110510134021;
有效,因為PHP將變量轉換為double。
所以用d
代替i
$i = unserialize('d:20110510134021;');
如果運行此腳本,您將在正在運行的系統上看到變量的正確表示(d:在32位系統上,i:在64位系統上):
$int = 20110510134021;
var_dump(serialize($int));
簡單的解決方案是,如果您知道在32位機器上序列化的數據有可能在32位機器上進行非序列化,則在序列化之前將其轉換為(double)。
然后它將被反序列化為double,為每個整數提供比每個整數標准4字節(32位)更多的位
一旦反序列化,只需使用該數字作為雙精度。 在99%的情況下,這是一個很好的解決方案。 對於非常大的數字,在32位機器上分配給數字上的“真實”部分的位數仍然是不夠的。 我認為它是56位,所以最大整數仍然明顯大於int類型的32位。
怎么樣:
$serialized = 'i:20110510134021';
if (preg_match('/i\:([\d]+)/', $serialized, $match))
{
$unserialized = $match[1];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.