2009-06-07 2 views
3

У меня есть массив:PHP Bytes 2 DWord

$arr[0] = 95 
$arr[1] = 8 
$arr[2] = 0 
$arr[3] = 0 

Это байты. Мне нужен ДВОР. Я пробовал:

$dword = $arr[0]+$arr[1]*265+$arr[2]*265*265+$arr[3]*265*265*265; 

Это правильно, или я делаю неправильно?

ответ

4

Try:

$dword = (($arr[3] & 0xFF) << 24) | (($arr[2] & 0xFF) << 16) | (($arr[1] & 0xFF) << 8) | ($arr[0] & 0xFF); 

Это также можно сделать свой путь с некоторыми исправлениями:

$dword = $arr[0] + $arr[1]*0x100 + $arr[2]*0x10000 + $arr[3]*0x1000000; 

Или с помощью пакета/распаковки:

$dword = array_shift(unpack("L", pack("CCCC", $arr[0], $arr[1], $arr[2], $arr[3]))); 
+0

Спасибо, что помогли – 2009-06-07 15:31:46

0

Или в самом крайнем случае использования 256, а не 265.

+0

@Emil, 0xff 255, так что это было бы неправильно. – driis

+0

Извините. Виноват. :) –

+0

У меня 256 в моем коде, написано неправильно здесь: o. Thx – 2009-06-07 15:32:30

0

Yo ur должен работать корректно, но вы должны умножаться на 256, а не на 265. (в 8 бит есть 2^8 = 256 уникальных значений). Он работает, потому что умножение на 256 - это то же самое, что смещение бит 8 мест влево.

Возможно, вам стоит вместо этого использовать побитовые операторы, чтобы лучше передать намерение. См. http://theopensourcery.com/phplogic.htm

+0

У меня 256 в моем коде, написано неправильно здесь: o. Thx – 2009-06-07 15:32:33

2

Или попробуйте

<?php 
$arr = array(95,8,0,0); 
$bindata = join('', array_map('chr', $arr)); 
var_dump(unpack('L', $bindata));
оба (Emil H's и мой код) дают вам 2143 в качестве результата.

+0

+1. Я тоже думал об этом, но сначала хотел попробовать. Добавил его к моему ответу, чтобы найти, что вы уже это предложили. :) –

 Смежные вопросы

  • Нет связанных вопросов^_^