Как можно проанализировать 64-битную длину Java из двоичного файла в строку PHP? - PullRequest
1 голос
/ 12 сентября 2010

Я использовал распаковку для преобразования большинства типов данных, которые у меня есть, в двоичный файл, который я анализирую с небольшими проблемами.Я понятия не имею, как работать с 64-битной подписью с прямым порядком байтов.Я думаю, что этот тип данных хранится с использованием дополнения 2.Приложение файла данных, который я читаю, является Java-приложением, поэтому я предполагаю, что это дополнение 2.Мне не нужно работать с ним как с числом, а просто работать с ним как со строкой.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2010

32-битный PHP будет иметь только 32-битные целые числа со знаком, поэтому, насколько я знаю, нет способа изначально распаковать данные.

Следующий код должен быть способен читать двоичный код, двоичное 64-разрядное целое число с дополнением до двух:

<?php
function read_int64($fp)
{
  $hex = unpack('H16a', fread($fp, 8));
  $hex = '0x'.$hex['a'];

  $n = gmp_init($hex);

  if (gmp_testbit($n, 63))
  {
    $n = gmp_xor($n, '0xffffffffffffffff'); // flip the bits
    $n = gmp_neg(gmp_add($n, 1));           // add one and negate
  }

  return gmp_strval($n);
}
?>

Возвращает целое число в виде строки. Может использоваться как:

$fp = fopen('test.bin', 'rb');
echo read_int64($fp)."\n";
fclose($fp);

(Редактировать: обновлен код для вызова меньшего количества функций GMP.)

0 голосов
/ 12 сентября 2010

64-битные целые числа Java действительно хранятся изначально как «сетевой порядок» (с прямым порядком байтов, т. Е. Начинаются с самого старшего байта) в формате дополнения до 8 байтов.Поэтому обычно вы берете байт за раз, смещаетесь влево на 8, повторяете.Значения байтов можно рассматривать как беззнаковые (в то время как результат подписан), но при сдвиге влево это не должно иметь значения.Итак: сначала вы только что создали эквивалентные 64-битные int из байтов, и отобразите оттуда.Нет смысла использовать короткие пути;хотя это возможно, вы просто получите более сложный и менее эффективный код.

...