2010-08-31 115 views
5

我有一個整數,其值之間浮動:4000000000-4294967000(小於INT最多爲4字節無符號整數)寫大4字節整數爲一個無符號二進制

,我想將它保存到文件,然後再讀取值

$f = fopen($fileName, 'wb'); fwrite($f, pack('I', $value)); 

,在文件中,值必須是精確的4字節無符號整型,因爲外部設備將期望數據的格式是很重要的。但PHP將這些大值存儲爲float,並破壞了二進制表示。

我怎麼可以用這種格式寫入數字?

[編輯] @FractalizeR THX這個作品我有:

protected static function handleUint($direction, $value) 
{ 
    if($direction == 'encode') 
    { 
     $first2bytes = intval($value/(256 * 256)); 
     $second2bytes = intval($value - $first2bytes); 

     return pack('n2', $first2bytes, $second2bytes); 
    } 
    else 
    { 
     $arr = unpack('n2ints', $value); 
     $value = $arr['ints1'] * (256 * 256) + intval($arr['ints2']) - 1; 
     return $value; 
    } 
} 

但我不太明白,爲什麼我要-1返回值,並且是這個二進制文件將產生正確的?

回答

1

那麼,拆分4個字節數爲2個2字節數(由256 * 256整數除法以獲得所述第一單詞和減去從原始一個值,以獲得第二個)並寫入兩個包。

+0

嘿,thx :)你可以檢查我的執行工作是否正確嗎? – canni 2010-08-31 10:14:48

1

如果你想分割你的int成4個字節,你可以做到以下幾點:

int x = 13434; 
byte[] buff = new byte[] { 
     (byte)((x >> 24) & 0xff), 
     (byte)((x >> 16) & 0xff), 
     (byte)((x >> 8) & 0xff), 
     (byte((x) & 0xff) 
} 

這裏使用的方法被稱爲位運算。

參見:http://en.wikipedia.org/wiki/Bitwise_operation

希望這有助於。

編輯:

我覺得這是你會怎麼做同樣的PHP:

$arr = array(
     ((x >> 24) & 0xff), 
     ((x >> 16) & 0xff), 
     ((x >> 8) & 0xff), 
     (x & 0xff) 
); 

參見:http://php.net/manual/en/language.operators.bitwise.php

+0

這不是PHP :) – 2010-08-31 18:55:51

1

不要擔心它是一個浮動。如果介於2^31和2^32-1之間,則不會有任何問題。

PHP浮點數有一個52位尾數,因此可以存儲沒有精度損失32位數字。

您告訴pack要編碼一個整數,並將其傳遞給一個浮點數,它會將浮點數轉換爲整數。浮標,其值是2^31和2^32-1之間的整數,轉換爲:負數在32位機器:

 
$ php -r "var_dump((int) 4000000000);" 
int(-294967296) 

在64位機,將得到的整數太:

 
$ php -r "var_dump((int) 4000000000);" 
int(4000000000) 

但是它們的字節表示是完全一樣的。 pack將返回相同的兩個:

 
$ php -r "var_dump(unpack('H*', pack('I', (float) 4000000000)));" 
array(1) { 
    [1]=> 
    string(8) "00286bee" 
} 
相關問題