a) Bạn chỉ cần lo lắng về "endianness" (tức là, hoán đổi byte) nếu dữ liệu được tạo trên máy tính lớn và đang được xử lý trên máy tính nhỏ hoặc ngược lại. Có nhiều cách có thể xảy ra, nhưng đây là một vài ví dụ.
- Bạn nhận dữ liệu trên máy Windows qua ổ cắm. Windows sử dụng kiến trúc nhỏ gọn trong khi dữ liệu mạng là "được cho là" ở định dạng lớn.
- Bạn xử lý tệp dữ liệu được tạo trên hệ thống có "độ dài cuối cùng" khác.
Trong cả hai trường hợp này, bạn sẽ cần phải chuyển đổi byte tất cả các số lớn hơn 1 byte, ví dụ:, quần short, ints, longs, double, etc. Tuy nhiên, nếu bạn luôn xử lý dữ liệu từ cùng một nền tảng, các vấn đề cuối cùng sẽ không đáng lo ngại.
b) Dựa trên câu hỏi của bạn, có vẻ như bạn có con trỏ char và muốn trích xuất 4 byte đầu tiên dưới dạng int rồi xử lý bất kỳ vấn đề nào về cuối. Để thực hiện việc trích xuất, hãy sử dụng tính năng này:
int n = *(reinterpret_cast<int *>(myArray)); // where myArray is your data
Rõ ràng, điều này giả định myArray không phải là con trỏ rỗng; nếu không, điều này sẽ sụp đổ vì nó dereferences con trỏ, do đó, sử dụng một chương trình lập trình phòng thủ tốt.
Để trao đổi các byte trên Windows, bạn có thể sử dụng các hàm ntohs()/ntohl() và/hoặc htons()/htonl() được định nghĩa trong winsock2.h. Hoặc bạn có thể viết một số thói quen đơn giản để làm điều này trong C++, ví dụ:
inline unsigned short swap_16bit(unsigned short us)
{
return (unsigned short)(((us & 0xFF00) >> 8) |
((us & 0x00FF) << 8));
}
inline unsigned long swap_32bit(unsigned long ul)
{
return (unsigned long)(((ul & 0xFF000000) >> 24) |
((ul & 0x00FF0000) >> 8) |
((ul & 0x0000FF00) << 8) |
((ul & 0x000000FF) << 24));
}
Nguồn
2009-02-13 07:10:12
Tôi hơi bối rối về những gì bạn đang cố gắng làm. Bạn có thể viết một số mã giả, làm ví dụ không? Bạn đang cố phân tích các số nguyên từ mảng ký tự? –
Tôi đang cố gắng tìm các byte sizeof (int) từ một mảng char * và cố gắng so sánh nó với một số nguyên. Nguồn dữ liệu là một máy khác. – kal