Các codebase tại nơi làm việc có chứa một số mã trông gần như thế này:Làm cách nào để diễn giải dữ liệu nhị phân dưới dạng số nguyên?
#define DATA_LENGTH 64
u_int32 SmartKey::SerialNumber()
{
unsigned char data[DATA_LENGTH];
// ... initialized data buffer
return *(u_int32*)data;
}
Mã này hoạt động một cách chính xác, nhưng GCC đưa ra cảnh báo sau đây:
warning: dereferencing pointer ‘serialNumber’ does break strict-aliasing rules
Ai đó có thể giải thích cảnh báo này? Mã này có nguy hiểm không? Làm thế nào nó có thể được cải thiện?
Cập nhật
Với nhờ James McNellis' câu trả lời tôi đã đưa ra các chức năng tiện ích sau:
template<class T, class Data>
T BinaryCast(const Data & inData)
{
T ret;
std::copy(&inData[0], &inData[0] + sizeof(ret), reinterpret_cast<char*>(&ret));
return ret;
}
u_int32 SmartKey::SerialNumber()
{
unsigned char data[DATA_LENGTH];
// ... initialized data buffer
return BinaryCast<u_int32>(data);
}
Hãy đề nghị cải tiến!
Có lẽ phải làm với con trỏ được đúc từ unsigned char * đến u_int32 * nhưng đã lâu rồi kể từ khi tôi đã làm C++. Nếu vậy, vì DATA_LENGTH là bội số chính xác của 32 nên không có vấn đề gì. –