pack () в php. Недопустимое шестнадцатеричное предупреждение - PullRequest
8 голосов
/ 19 января 2011

У меня проблемы с использованием pack () в php

$currencypair = "EUR/USD";
$buy_sell = "buy";
$alert_device_token =array("a","a","b");
$message = "Your " . $currencypair . " " . $buy_sell . " alert price has been reached!";
$payload['aps'] = array (
  'alert' => $message,
  'badge' => 1,
  'sound' => 'default'
);
$payload = json_encode($payload);

foreach ($alert_device_token as $alert_device)
{
  $apnsMessage = chr(0) . chr(0) . chr(32) . 
                 pack('H*', str_replace(' ', '', $alert_device)) . 
                 chr(0) . chr(strlen($payload)) . $payload;
  echo $apnsMessage;
}

Теперь иногда я получаю следующие предупреждения, использующие один и тот же код -

Warning: pack() [function.pack]: Type H: illegal hex digit g in /code/FR2BVl

хотя недопустимая шестнадцатеричная цифра постоянно меняется. Любые идеи об этом предупреждении и способах его устранения.

проверить это в прямом эфире здесь

Ответы [ 7 ]

6 голосов
/ 10 июля 2015

Одна из причин ошибки связана с контрольными суммами,

Поскольку целочисленный тип PHP подписан, результатом будет много контрольных сумм crc32. в отрицательных целых числах на 32-битных платформах. На 64-битных установках все Результаты crc32 () будут положительными целыми числами. Так что вам нужно использовать «% u» форматера sprintf () или printf () для получения строки представление неподписанной контрольной суммы crc32 () в десятичном формате. http://www.php.net/crc32

Чтобы исправить ошибку, этого может быть достаточно,

sprintf('%u', CRC32($someString))

В этом случае

pack('H*', str_replace(' ', '', sprintf('%u', CRC32($alert_device))))

Ссылка: https://github.com/bearsunday/BEAR.Package/issues/136

6 голосов
/ 19 января 2011

pack преобразует шестнадцатеричное число в двоичное, например:

  echo pack("H*", "2133")

производит !3, поскольку ! имеет код 0x21, а 3 имеет код 0x33.Поскольку g не является шестнадцатеричной цифрой, выдается предупреждение.Чтобы быть полезным для формата пакета H, аргумент должен быть шестнадцатеричным числом.Если $alert_device нет - вы должны использовать что-то еще, в зависимости от того, что это такое и что вы ожидаете в результате.

2 голосов
/ 03 апреля 2017

У меня возникла такая же проблема при разработке гибридного приложения с использованием Ionic / Cordova / PhoneGap.Поскольку один и тот же код выполняется на устройствах Android и iOS, я допустил ошибку при сохранении токена Google FCM в качестве токена APNS.Токен APNS является чисто шестнадцатеричным, но токен Google FCM может содержать не шестнадцатеричные символы.Таким образом, упаковка токена Google FCM с использованием функции PHP pack() приведет к ошибке illegal hex digit.

2 голосов
/ 22 января 2017

Используйте strtr(rtrim(base64_encode(pack('H*', sprintf('%u', $algo($data)))), '='), '+/', '-_') вместо использования pack('H*', $value).

1 голос
/ 06 октября 2014

Вы должны изменить

pack('H*', $someString)

На

strtr(rtrim(base64_encode(pack('H*', sprintf('%u', CRC32($someString))))
1 голос
/ 24 октября 2013

В этом случае $alert_device - это массив.

Для упаковки требуется значение.

Используйте pack('H*', str_replace(' ', '', $alert_device[0])) вместо.

0 голосов
/ 08 октября 2012

Попробуйте сохранить ваш файл в кодировке utf-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...