int to bytes()

tristram

Guest
int to bytes()

Нужно написать функцию int2bytes(). Четко сформулировать алгоритм не могу, т.к. сам не знаю. Если б знал сам бы написал.
PHP:
word($int) == int2bytes(2,$int);
dword($int) == int2bytes(4,$int);
qword($int) == int2bytes(8,$int);
всё облазил, нашел:
PHP:
function int2bytes($bytes,$val=0)
{
 $ret = "";
 for ($i=0; $i<$bytes; $i++)
 {
   $ret = chr(($val >> ($i*8) & 0xFF)).$ret;
 }
 return $ret;
}
работает (в моем icq-клиете) но мне кажется алгоритм не совсем правильный, т.к.
int2bytes(8,0x01) == "\x00\x00\x00\x01\x00\x00\x00\x01",
а по смыслу должно быть "\x00\x00\x00\x00\x00\x00x00\x01".
Простите мне мою глупость, с такими данными пару недавно знаком.
Спасибо всем. :rolleyes:
 

tristram

Guest
SiMM
а какой формат выбирать?

-~{}~ 20.07.05 18:44:

Ну, народ, подскажите =((
 

SiMM

Новичок
За эти почти 5 часов ты бы мог уже во всём разобраться путём несложных экспериментов.
 

SiMM

Новичок
> боюсь что-нибудь не так сделаю
А в первую брачную ночь тоже на форум придёшь с вопросами?
 

SiMM

Новичок
> харэ прикалыватся
А по моему это ты прикалываешься. Давай посмотрим на твою фразу

> боюсь что-нибудь не так сделаю
Ну и что? Что случиться то? Земля перевернётся? Винт форматнётся? Операция pack ничего такого не делает. Тогда чего бояться?
Я понимаю если бы ты просто был не уверен в правильности своего решения - ну так ничто же его тебе не мешает опубликовать и спросить, правильно ли ты всё делаешь. Только, честно говоря, не думаю, что это имеет какой-то смысл - функция проста и примитивна - ошибиться - очень сложно. Разве что очень сильно постараться.

PS: в конце концов ни что не мешает тебе сделать тест, подставляя нужные параметры в свою старую функцию и в pack, а затем сравнивая результат.
 

SiMM

Новичок
tristram, так ты ничему не научишься.
PHP:
function word($w){ return pack('n',$w); }
function dword($dw){ return pack('N',$dw); }
И больше не клянчи. Нормального qword'а в PHP, насколько я понимаю, не получится.
 

tristram

Guest
какой я ууууммныыый, сам диву даюсь.
PHP:
function int2bytes($len,$int=0x00)
{
 $hexstr = dechex($int);
 if ($len === NULL) {if (strlen($hexstr) % 2) {$hexstr = "0".$hexstr;}}
 else {$hexstr = str_repeat("0",$len*2-strlen($hexstr)).$hexstr;}
 $bytes = strlen($hexstr)/2;
 $bin = "";
 for($i=0;$i<$bytes;$i++) {$bin .= chr(hexdec(substr($hexstr,$i*2,2)));}
 return $bin;
}
 

SiMM

Новичок
> самое то
Самое что? Намудить туеву хучу кода вместо того, чтобы воспользоваться готовой функцией? Даже первый вариант был куда лучше этой бредятины. Кроме того, ни тот, ни этот код, не может работать с с qword.
PHP:
echo int2bytes(8,1311768466852950544); // 0x1234567876543210
 
Сверху