BitConverter.ToUInt32 в php?

92
09 февраля 2021, 21:20

Есть в c# метод BitConverter.ToUInt32. Какой аналог у него в php? Просмотрел весь SO - не нашёл ответ

byte[] hash = MakeHash(value);
uint k = BitConverter.ToUInt32(hash, hash.Length - _signLen);

Делаю так, но на выходе null почему-то

$hash = $this->MakeHash($value);
$res = unpack("L", $hash,8);
Answer 1

у вас $hash это массив байт, хотя unpack ожидает на входе бинарную строку.
Можно сначала упаковать в бинарную строку, потом извлечь целые (для старых версих пхп, где параметра offset нет:

$hash = [102,41,156,64,54,101,223,38,209,47,90,173,60,141,126,108];
$bin = pack("C*", ...$hash);
echo bin2hex($bin) . "\n" ;
$k = unpack("L*", $bin);
print_r($k);

получите

66299c403665df26d12f5aad3c8d7e6c
Array
(
    [1] => 1083976038
    [2] => 652174646
    [3] => 2908368849
    [4] => 1820233020
)

То ест искомое значение будет третьим в массиве. В пхп 7.1 можно сразу сделать

$k = unpack("L", $bin , 8); 

В целом нет смысла упаковывать весь массив, если нам нужны только 4 байта из него, то их и надо сначала извлечь, а потом сформировать int.

 $offset = 8;
 $data = array_slice($hash, $offset, 4);
 $tmp = pack("C*", ...$data);
 $k = unpack("L", $tmp);

В целом чтобы из 4х байт составить двойное слово никакие pack/unpack, конечно, не нужны. достаточно расставить байты на свои места, используя битовые сдвиги:

$offset = 8;
$b = array_slice($hash, $offset, 4);
$k = ($b[0] << 0) +
     ($b[1] << 8) +
     ($b[2] << 16)+
     ($b[3] << 24);
READ ALSO
Как вызвать Java метод из NDK(JNI)?

Как вызвать Java метод из NDK(JNI)?

В своем андроид приложении я использую NDK и у меня есть вот такой метод

96
Intellij Idea проблема с подсказками

Intellij Idea проблема с подсказками

Сделал pull проекта на другой компьютерТеперь Idea подчеркивает названия View в контроллере, которые я разрешаю TilesViewResolver, в jsp не видит модель...

123