簡體   English   中英

PHP從64位到32位的非序列化整數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM