2011-01-19 10 views
7

estoy teniendo algunos problemas usando pack() en phppaquete() en php. advertencia hexagonal dígitos ilegal

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

Ahora a veces me sale siguientes advertencias que ejecutan el mismo código -

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

el dígito hexadecimal ilegal sigue variando sin embargo. Cualquier idea sobre esta advertencia y formas de eliminarla.

comprobar que viven here

+0

Publique más código. El 'str_replace()' en '$ alert_device' me hace pensar que hay más código en el medio que podría estar modificando el contenido de' $ alert_device'. Con el código publicado, no debería recibir el error que está recibiendo. –

+0

@sander: vea la pregunta editada. – ayush

+0

En mi caso, recibí este error cuando estaba tratando de pasar un valor vacío (o una barra inclinada /) a la función pack(). Descubrí qué causaba el valor vacío y lo solucioné. – Volomike

Respuesta

6

pack convierte número hexadecimal a binario, ej .:

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

produce !3, ya que tiene ! código 0x21 y 0x33 3 tiene código. Como g no es un dígito hexadecimal, se da una advertencia. Para ser útil para el formato H del paquete, el argumento debe ser un número hexadecimal. Si $alert_device no lo está, debe usar algo más, dependiendo de lo que sea y lo que espera como resultado.

-2

Intente guardar su archivo en la codificación utf-8.

0

En este caso, $alert_device es una matriz.

Para embalar necesita un valor.

Use pack('H*', str_replace(' ', '', $alert_device[0])) en su lugar.

1

Debe cambiar

pack('H*', $someString) 

Para

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

Por favor, ¿puedes agregar algo de explicación? – Zulu

6

Una de las razones para el error está relacionado con las sumas de comprobación,

Debido tipo entero de PHP se han suscrito múltiples sumas de comprobación CRC32 dará como resultado en números enteros negativos en plataformas de 32 bits. En las instalaciones de 64 bits, todos los resultados crc32() serán enteros positivos. Por lo tanto, debe usar el formateador "% u" de sprintf() o printf() para obtener la cadena representación de la suma de comprobación crc32() sin signo en formato decimal. http://www.php.net/crc32

para corregir el error que esto podría ser suficiente,

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

En este caso,

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

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

2

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

0

Estaba teniendo el mismo problema al desarrollar una aplicación híbrida usando Ionic/Cordova/PhoneGap. Como la misma cade se ejecuta en dispositivos Android e iOS, cometí un error al almacenar el token de Google FCM como token de APNS.El token APNS es puramente hexadecimal, pero el token de Google FCM puede tener caracteres no hexadecimales. Entonces, empaquetar un token de Google FCM usando la función pack() de PHP dará como resultado el error illegal hex digit.

Cuestiones relacionadas