2011-01-19 10 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.

Problemi correlati