2011-01-19 6 views
7

Sto avendo alcuni problemi con pack() in PHPpack() in php. Illegal avvertimento esadecimale cifre

$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; 
} 

Ora a volte ho seguenti avvisi che eseguono lo stesso codice -

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

la cifra esadecimale illegale continua variando però. Qualche idea su questo avvertimento e sui modi per rimuoverlo.

controllare vivo here

+0

Invia più codice. Il 'str_replace()' su '$ alert_device' mi fa pensare che ci sia più codice nel mezzo che potrebbe modificare il contenuto di' $ alert_device'. Con il codice pubblicato, non dovresti ottenere l'errore che stai ricevendo. –

+0

@sander: vedere la domanda modificata. – ayush

+0

Nel mio caso, ho ricevuto questo errore quando stavo cercando di passare un valore vuoto (o una barra /) alla funzione pack(). Ho scoperto cosa stava causando il valore vuoto e ho risolto il problema. – Volomike

risposta

6

pack converte numero esadecimale in binario, per es .:

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

produce !3, poiché ! ha codice 0x21 e 3 ha codice 0x33. Poiché g non è una cifra esadecimale, viene visualizzato un avviso. Per essere utile per il formato H del pacchetto, l'argomento deve essere il numero esadecimale. Se $alert_device non lo è, dovresti usare qualcos'altro, a seconda di cosa è e cosa ti aspetti dal risultato.

-2

Provare a salvare il file nella codifica utf-8.

0

In questo caso, $alert_device è un array.

Per l'imballaggio ha bisogno di un valore.

Utilizzare pack('H*', str_replace(' ', '', $alert_device[0])) invece.

1

È necessario modificare

pack('H*', $someString) 

Per

strtr(rtrim(base64_encode(pack('H*', sprintf('%u', CRC32($someString)))) 
+2

Si prega di aggiungere qualche spiegazione? – Zulu

6

Uno dei motivi per l'errore è legato alle checksum,

Perché tipo intero del PHP è firmato molti checksum CRC32 risulterà in numeri interi negativi su piattaforme a 32 bit. Su installazioni a 64 bit, tutti i risultati di crc32() saranno comunque interi positivi. Quindi è necessario utilizzare il formattatore "% u" di sprintf() o printf() per ottenere la stringa rappresentazione del checksum crc32() senza segno in formato decimale. http://www.php.net/crc32

per correggere l'errore questo potrebbe essere sufficiente,

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

In questo caso,

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

Rif: https://github.com/bearsunday/BEAR.Package/issues/136

2

Uso strtr(rtrim(base64_encode(pack('H*', sprintf('%u', $algo($data)))), '='), '+/', '-_') invece di utilizzare pack('H*', $value).

0

Ho riscontrato lo stesso problema durante lo sviluppo di un'app ibrida tramite Ionic/Cordova/PhoneGap. Poiché lo stesso cade viene eseguito su dispositivi Android e iOS, ho commesso l'errore di archiviare il token FCM di Google come token APNS.Il token APNS è puramente esadecimale, ma il token FCM di Google può avere caratteri non esadecimali. Pertanto, l'inserimento di un token GoogleMC Google utilizzando la funzione PHP pack() comporterà l'errore illegal hex digit.