¿Qué formato de entero al leer datos binarios de Java DataOutputStream en PHP?

Soy consciente de que esta probablemente no sea la mejor idea, pero he estado jugando tratando de leer un archivo en PHP que fue codificado usando DataOutputStream de Java.

Específicamente, en Java uso:

dataOutputStream.writeInt(number);

Luego en PHP leí el archivo usando:

$data = fread($handle, 4);
$number = unpack('N', $data);

Lo extraño es que el único carácter de formato en PHP que da el valor correcto es 'N', que se supone que representa "largo sin firmar (siempre 32 bits, orden de bytes big endian)". pensé que int en java siempre fue firmado?

¿Es posible leer de manera confiable los datos codificados en Java de esta manera o no? En este caso, el entero solo necesitará ser positivo. Es posible que también deba ser bastante grande para que writeShort() no es posible. De lo contrario, por supuesto, podría usar XML o JSON o algo así.

preguntado el 02 de mayo de 12 a las 19:05

2 Respuestas

Esto está bien, siempre y cuando no necesites ese bit extra. l (en lugar de N) funcionaría en una máquina big endian.

Tenga en cuenta, sin embargo, que el número máximo que puede almacenar es 2,147,483,647, a menos que desee hacer algunos cálculos en el lado de Java para obtener el entero negativo adecuado para representar el entero sin signo deseado.

Tenga en cuenta que un entero de Java con signo usa el método de complemento a dos para representar un número negativo, por lo que no es tan fácil como voltear un poco.

contestado el 02 de mayo de 12 a las 20:05

DataOutputStream.writeInt:

Escribe un int en el flujo de salida subyacente como cuatro bytes, el byte alto primero.

Todos los formatos disponibles para la función de desempaquetar para enteros con signo utilizan un orden de bytes dependiente de la máquina. Supongo que su máquina usa un orden de bytes diferente al de Java. Si eso es cierto, la combinación DataOutputStream + desempaquetar no funcionará para ninguna primitiva firmada.

contestado el 02 de mayo de 12 a las 19:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.