10

PHPでpack()を使用すると問題が発生します

$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

ただし、不正な16進数は変化し続けます。この警告とそれを削除する方法についてのアイデア。

ここでライブチェック

4

7 に答える 7

8

pack16 進数を 2 進数に変換します。例:

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

コード 0x21 とコード 0x33 が!3あるため、が生成されます。は 16 進数ではないため、警告が表示されます。パックのフォーマットに役立つようにするには、引数を 16 進数にする必要があります。そうでない場合は、それが何であるか、および結果として期待するものに応じて、別のものを使用する必要があります。!3gH$alert_device

于 2011-01-19T07:38:17.167 に答える
6

エラーの理由の 1 つは、チェックサムに関連しています。

PHP の整数型は符号付きであるため、32 ビット プラットフォームでは多くの crc32 チェックサムが負の整数になります。ただし、64 ビットのインストールでは、すべての crc32() の結果は正の整数になります。そのため、sprintf() または printf() の "%u" フォーマッタを使用して、10 進形式の符号なし 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

于 2015-07-10T07:51:09.190 に答える
1

あなたは変わらなければなりません

pack('H*', $someString)

strtr(rtrim(base64_encode(pack('H*', sprintf('%u', CRC32($someString))))
于 2014-10-06T10:45:11.230 に答える
-3

ファイルを utf-8 エンコーディングで保存してみてください。

于 2012-10-08T06:38:39.697 に答える