2012-03-07 6 views
9

Esiste un meccanismo simile a std::streambuf per convertire i valori multibyte nell'ordine di byte di rete? In particolare, Boost Asio offre una così primitiva? Ecco un esempio di quello che vorrei che il buffer di flusso da fare:Esiste una versione std :: streambuf che converte l'host in ordine di byte di rete?

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 

EDIT: Le risposte suggeriscono che questo è il modo sbagliato di pensare al problema: buffer di flusso semplicemente forniscono l'accesso a sequenze di caratteri, il loro compito non è quello di eseguire I/O o conversione formattati. Probabilmente implementerò una piccola classe di buffer che fornisce gli overload necessari per operator<< e operator>> per eseguire la conversione.

+0

La tua domanda avrebbe più senso se hai definito "b2" nel tuo esempio. Inoltre, perché l'operatore << (..., unsigned long long) 'invoca' htons'? Non preferiresti invocare 'htonll'? –

+0

Grazie Rob, ho corretto gli errori. – mavam

+3

Penso che tu stia cercando la soluzione nel posto sbagliato. Quando il formattatore ('ostream') ha finito, passa un flusso di byte allo' streambuf'. Sembra proprio che tu voglia un "ostream" "binario" se l'ordine dei byte dei numeri di uscita è un problema che stai cercando di risolvere. –

risposta

7

No, e ti dirò perché.

istream::operator>> e ostream::operator<< operano su un flusso di caratteri, convertendoli dalla forma leggibile dall'uomo alla forma nativa del computer. streambuf non partecipa a questa conversione, tranne che per fornire (o accettare) un flusso di caratteri.

Per dirla in un altro modo, le routine di I/O formattate convertono da forma carattere in forma binaria.

Si sta richiedendo una conversione da un modulo binario a un altro modulo binario. Non è la stessa cosa e le routine di testo formattate stream non sono corrette.

Detto questo, si potrebbe creare la propria classe che implementa operator<< e operator>>, e hanno quelli routine fanno di byte di rete swapping.

+1

ancora questo è un modello comune, specialmente in rete. c'è una biblioteca che offre un servizio simile? –

Problemi correlati