Tengo un código de servidor coap ejecutándose en mi puerta de enlace que puede tener arquitectura x86 o ARM, que envía un Buffer al cliente coap en otro hardware que puede tener arquitectura x86 o ARM, mi pregunta es, en un escenario específico donde el cliente tiene arquitectura x86 y el servidor tiene arquitectura ARM, cuando el búfer es escrito por el servidor y el cliente analiza, el búfer de carga útil producirá una incompatibilidad, ¿en consecuencia un error?

Obs: pregunto esto porque la arquitectura x86 es little-endian y la arquitectura ARM es Big-endian.

0
Vinicius França 26 jun. 2020 a las 19:38

3 respuestas

La mejor respuesta

Para intercambiar datos binarios sin formato entre sistemas de arquitecturas posiblemente diferentes, los datos deben ponerse en un formato canónico conocido. El remitente debe asegurarse de que esté en ese formato conocido y el destinatario debe esperarlo en ese formato conocido.

Para algunas cosas eso es fácil. Si es simplemente una matriz de valores U8 (valores de 8 bits sin signo), entonces ese ya es un formato canónico conocido.

Pero, si se trata de una matriz de valores U16, U32, U64, S16, S32, S64 o cualquier tipo de formato que contenga esos valores más grandes, entonces debe saber si está en formato de bytes big endian o little endian. Tendrá que decidir cuál es el formato de intercambio y asegurarse de poner los datos en ese formato antes de enviarlos y el destinatario debe aceptar los datos en ese formato, quizás convirtiéndolos en lo que quiere usar de forma nativa.

Por lo tanto, no puede enviar ciegamente datos de varios bytes desde una pequeña arquitectura endian a una arquitectura endian grande sin convertirla. Es mejor decidir sobre un formato de intercambio específico, hacer que el remitente de los datos se asegure de que los datos se convierten a ese formato de intercambio y asegúrese de que el destinatario esté esperando los datos en ese formato de intercambio.

Para su información, para cantidades modestas de datos, esta es la razón por la cual existen formatos no binarios como JSON y se han vuelto tan populares porque ya son un estándar bien conocido que no tiene problemas de pedido endian.

1
jfriend00 26 jun. 2020 a las 16:55

El protocolo CoAP funciona entre máquinas de cualquier endianness.

CoAP no realiza ninguna conversión en los datos que se transportan en la carga útil de solicitud / respuesta, pero los formatos comunes allí están bien especificados, al igual que CoAP.

-1
chrysn 26 jun. 2020 a las 17:03

La mayoría de las CPU ARM modernas son little-endian, igual que x86. (https: / /en.wikipedia.org/wiki/Endianness). Algunas CPU ARM pueden ejecutarse en cualquier modo (bi-endian), pero normalmente se ejecutan en modo little-endian.

Esto es opuesto al "orden de bytes de red" que CoAP aparentemente especifica sus encabezados de protocolo, pero probablemente pueda salirse con la suya enviando sus propios datos brutos de carga útil como little-endian si lo desea.

-1
Peter Cordes 26 jun. 2020 a las 18:51