Tôi đang làm việc để triển khai giao thức memcache, tại một số điểm, sử dụng giá trị số nguyên 64 bit. Các giá trị này phải được lưu trữ trong "thứ tự byte mạng".Có chức năng htonl "chuẩn" nào cho các số nguyên 64 bit trong C++ không?
Tôi muốn có một số chức năng uint64_t htonll(uint64_t value)
để thực hiện thay đổi, nhưng rất tiếc, nếu nó tồn tại, tôi không thể tìm thấy.
Vì vậy, tôi có 1 hoặc 2 câu hỏi:
- Có di (Windows, Linux, AIX) chức năng tiêu chuẩn để làm việc này?
- Nếu không có chức năng như vậy, bạn sẽ triển khai như thế nào?
Tôi đã lưu ý đến việc triển khai cơ bản nhưng tôi không biết cách kiểm tra tính cuối cùng trong thời gian biên dịch để làm cho mã di động. Vì vậy, sự giúp đỡ của bạn được hoan nghênh hơn ở đây;)
Cảm ơn bạn.
Đây là giải pháp cuối cùng tôi đã viết, nhờ giải pháp của 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;
}
}
có thể trùng lặp của http://stackoverflow.com/questions/809902/64-bit-ntohl-in-c – INS
@ereOn: Tôi cũng có câu hỏi tương tự [tại đây] (http://stackoverflow.com/ câu hỏi/19393539/how-to-swap-64-bit-số nguyên trong khi trích xuất-byte-từ-bytearray-in-c). Nếu có thể, bạn có thể xem và cho tôi biết tôi đang làm gì sai ở đây? – AKIWEB
Thay vì bao gồm câu trả lời của bạn bên trong câu hỏi, bạn nên để câu trả lời của bạn với câu trả lời. Nó dễ đọc hơn. – mpromonet