2012-03-07 26 views
9

Có cơ chế std::streambuf để chuyển đổi giá trị nhiều byte sang thứ tự byte mạng không? Đặc biệt, Boost Asio có cung cấp nguyên thủy như vậy không? Dưới đây là một ví dụ về những gì tôi muốn bộ đệm dòng để làm:Có phiên bản std :: streambuf chuyển đổi thứ tự byte của máy chủ sang mạng không?

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: Những câu trả lời gợi ý rằng đây là cách sai lầm khi nghĩ về vấn đề này: bộ đệm dòng chỉ đơn giản là cung cấp quyền truy cập vào chuỗi ký tự, công việc của họ không phải là thực hiện định dạng I/O hoặc chuyển đổi. Tôi có thể sẽ triển khai một lớp đệm nhỏ cung cấp các tình trạng quá tải cần thiết cho operator<<operator>> để thực hiện chuyển đổi.

+0

Câu hỏi của bạn sẽ có ý nghĩa hơn nếu bạn đã xác định 'b2' trong ví dụ của mình. Ngoài ra, tại sao 'toán tử << (…, unsigned long long)' gọi 'htons'? Bạn sẽ không thích nó để gọi 'htonll'? –

+0

Cảm ơn Rob, tôi đã sửa lỗi. – mavam

+3

Tôi nghĩ rằng bạn đang tìm kiếm giải pháp ở sai địa điểm. Khi trình định dạng ('ostream') kết thúc, nó sẽ truyền một luồng byte tới' streambuf'. Có vẻ như bạn thực sự muốn một "nhị phân" ostream' nếu thứ tự byte của các số đầu ra là một vấn đề mà bạn đang cố gắng giải quyết. –

Trả lời

7

Không, và tôi sẽ cho bạn biết lý do.

istream::operator>>ostream::operator<< hoạt động trên luồng ký tự, chuyển đổi chúng từ dạng có thể đọc được của con người sang dạng gốc của máy tính. streambuf không tham gia vào chuyển đổi đó, ngoại trừ việc cung cấp (hoặc chấp nhận) một luồng ký tự.

Để đặt theo cách khác, định dạng I/O được định dạng sẽ chuyển đổi từ dạng ký tự thành dạng nhị phân.

Bạn đang yêu cầu chuyển đổi từ một dạng nhị phân sang dạng nhị phân khác. Đó không phải là điều tương tự, và các thói quen văn bản định dạng stream là địa điểm sai để xem.

Điều đó nói rằng, bạn có thể tạo lớp của riêng bạn mà thực hiện operator<<operator>>, và có những thói quen làm mạng byte trao đổi.

+1

nhưng đây là một mô hình phổ biến, đặc biệt là trong mạng. thư viện có cung cấp dịch vụ tương tự không? –

Các vấn đề liên quan