Estoy trabajando en una implementación del protocolo Memcache que, en algunos puntos, usa valores enteros de 64 bits. Estos valores deben almacenarse en "orden de bytes de red".¿Hay alguna función htonl "estándar" para enteros de 64 bits en C++?
Ojalá hubiera alguna función de uint64_t htonll(uint64_t value)
para hacer el cambio, pero desafortunadamente, si existe, no pude encontrarlo.
Así que tengo 1 o 2 preguntas:
- ¿Hay alguna portátil (Windows, Linux, AIX) función estándar de hacer esto?
- Si no existe tal función, ¿cómo la implementaría?
Tengo en mente una implementación básica, pero no sé cómo comprobar el endianness en tiempo de compilación para hacer que el código sea portátil. Entonces su ayuda es más que bienvenida aquí;)
Gracias.
Aquí está la solución final que escribí, gracias a la solución de Brian.
uint64_t htonll(uint64_t value)
{
// The answer is 42
static const int num = 42;
// Check the endianness
if (*reinterpret_cast<const char*>(&num) == num)
{
const uint32_t high_part = htonl(static_cast<uint32_t>(value >> 32));
const uint32_t low_part = htonl(static_cast<uint32_t>(value & 0xFFFFFFFFLL));
return (static_cast<uint64_t>(low_part) << 32) | high_part;
} else
{
return value;
}
}
posible duplicado de este http://stackoverflow.com/questions/809902/64-bit-ntohl-in-c – INS
@ereOn: También tengo una pregunta similar [aquí] (http://stackoverflow.com/ preguntas/19393539/how-to-swap-64-bit-integer-while-extracting-bytes-from-bytearray-in-c). Si es posible, ¿puedes echar un vistazo y decirme qué mal estoy haciendo aquí? – AKIWEB
En lugar de incluir su respuesta dentro de la pregunta, debe dejar su respuesta con respuestas. Es más legible – mpromonet