2012-03-07 8 views
9

¿Hay un mecanismo similar a std::streambuf para convertir valores de bytes múltiples en orden de bytes de red? En particular, ¿Boost Asio ofrece una primitiva? He aquí un ejemplo de lo que me gustaría que el búfer de la secuencia que debe hacer:¿Hay una versión std :: streambuf que convierta el host en orden de bytes de red?

uint64_t x = 42ull; 
network_streambuf b1; 
std::ostream os(&b1); 
os << 42ull; // htonll 

network_streambuf b2; 
std::istream is(&b2); 
uint64_t y; 
is >> y; // ntohll 

EDITAR: Las respuestas sugieren que esta es la manera equivocada de pensar en el problema: los búferes de secuencia sólo tiene que proporcionar acceso a secuencias de caracteres, su trabajo no es realizar E/S formateadas o conversión. Probablemente implementaré una pequeña clase de búfer que proporciona las sobrecargas necesarias para operator<< y operator>> para realizar la conversión.

+0

Su pregunta tendría más sentido si definió 'b2' en su ejemplo. Además, ¿por qué 'operator << (..., unsigned long long) 'invocar' htons'? ¿No preferiría invocar 'htonll'? –

+0

Gracias Rob, corregí los errores. – mavam

+3

Creo que está buscando la solución en el lugar equivocado. Para cuando el formateador ('ostream') ha terminado, pasa una secuencia de bytes al' streambuf'. Parece que realmente quieres un 'binario' 'ostream' si el orden de bytes de los números de salida es un problema que estás tratando de resolver. –

Respuesta

7

No, y le diré por qué.

istream::operator>> y ostream::operator<< operan en una secuencia de caracteres, convirtiéndolos de su forma legible por humanos a la forma nativa de la computadora. streambuf no participa en esa conversión, excepto para proporcionar (o aceptar) una secuencia de caracteres.

Dicho de otra manera, las rutinas de E/S formateadas se convierten de forma de carácter a formato binario.

Está solicitando una conversión de un formulario binario a otro formulario binario. Eso no es lo mismo, y las rutinas de texto con formato stream son el lugar equivocado para buscar.

Dicho esto, usted podría crear su propia clase que implementa operator<< y operator>>, y tienen los rutinas hacen intercambio de bytes de red.

+1

, pero este es un patrón común, especialmente en redes. ¿Hay una biblioteca que ofrezca un servicio similar? –

Cuestiones relacionadas