2012-10-17 36 views
5

Tôi có một chương trình c bên dưới, tôi muốn gửi một tin nhắn 32 bit theo thứ tự cụ thể Eg.0x00000001.Tại sao đầu ra trông như thế này?

#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <stdint.h> 

struct test 
{ 
    uint16_t a; 
    uint16_t b; 
}; 

int main(int argc, char const *argv[]) 
{ 
    char buf[4]; 
    struct test* ptr=(struct test*)buf; 
    ptr->a=0x0000; 
    ptr->b=0x0001; 
    printf("%x %x\n",buf[0],buf[1]); //output is 0 0 
    printf("%x %x\n",buf[2],buf[3]); //output is 1 0 
    return 0; 
} 

Sau đó, tôi thử nghiệm bằng cách in ra các giá trị trong mảng char. Tôi nhận được đầu ra trong các ý kiến ​​trên. Không nên đầu ra là 0 0 và 0 1? vì [3] là byte cuối cùng? Có điều gì tôi đã bỏ lỡ không?

Cảm ơn!

Trả lời

7

Nguyên nhân là người cuối cùng nhỏ bé của nó. Đọc: Endianness

Đối với dịch chúng vào nề nếp mạng, bạn phải sử dụng htonl (host-to-network-dài) và htons (host-to-network-ngắn) chức năng dịch. Sau khi nhận được, bạn cần sử dụng các hàm ntohlntohs để chuyển đổi từ mạng sang thứ tự máy chủ. Thứ tự byte của bạn được đặt trong mảng phụ thuộc vào cách bạn đặt chúng vào bộ nhớ. Nếu bạn đặt chúng thành bốn byte ngắn riêng biệt, bạn sẽ bỏ qua chuyển đổi cuối cùng. Bạn có thể sử dụng loại char cho loại thao tác byte thô này.

+0

vậy thông báo trông như thế nào khi tôi gửi bằng sendto() từ socket.h? Nó sẽ là 0x00000001 hoặc 0x00000100? – kun

+0

@cjk: bạn cần phải sử dụng 'htons' để gửi, nó phụ thuộc vào việc biết chính xác endianness cho bạn. – Vlad

0

Windows lưu giữ các dữ liệu là "little endian" vì vậy các byte được đảo ngược. Xem Endiannes để biết thêm thông tin.

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