Trong câu hỏi của mình, bạn đã nói rằng bạn muốn chuyển đổi đầu vào của người dùng là 175 thành
00000000 00000000 00000000 10101111
, thứ tự byte cuối lớn , còn được gọi là thứ tự byte mạng .
Một cách chủ yếu di động để chuyển đổi số nguyên không dấu của bạn thành một mảng ký tự không dấu endian lớn, như bạn đã đề xuất từ ví dụ "175" mà bạn đã đưa ra, sẽ là sử dụng htonl()
hàm của C (được định nghĩa trong tiêu đề <arpa/inet.h>
trên hệ thống Linux) để chuyển đổi số nguyên không dấu của bạn thành thứ tự byte cuối lớn, sau đó sử dụng memcpy()
(được định nghĩa trong tiêu đề <string.h>
cho C, <cstring>
cho C ++) để sao chép các byte vào mảng char (hoặc char không dấu) của bạn.
Các htonl()
chức năng có trong một số nguyên 32-bit unsigned như một cuộc tranh cãi (trái ngược với htons()
, trong đó có một số nguyên 16-bit unsigned) và chuyển đổi nó vào mạng thứ tự byte từ thứ tự chủ byte (do đó từ viết tắt, Host ĐẾN Mạng Long, so với Host TO Network Viết tắt của htons
), trả về kết quả là một số nguyên 32 bit không dấu. Mục đích của nhóm chức năng này là đảm bảo rằng tất cả các giao tiếp mạng xảy ra theo thứ tự byte cuối lớn, để tất cả các máy có thể giao tiếp với nhau qua một socket mà không gặp vấn đề về thứ tự byte. (Là một sang một bên, cho máy lớn về cuối nhỏ, các htonl()
, htons()
, ntohl()
vàntohs()
các hàm thường được biên dịch để chỉ là 'no op', bởi vì các byte không cần phải được lật lại trước khi chúng được gửi hoặc nhận từ một socket vì chúng đã có thứ tự byte thích hợp)
Đây là mã:
#include <stdio.h>
#include <arpa/inet.h>
#include <string.h>
int main() {
unsigned int number = 175;
unsigned int number2 = htonl(number);
char numberStr[4];
memcpy(numberStr, &number2, 4);
printf("%x %x %x %x\n", numberStr[0], numberStr[1], numberStr[2], numberStr[3]);
return 0;
}
Lưu ý rằng, như caf đã nói, bạn phải in các ký tự dưới dạng ký tự không dấu bằng cách sử dụng bộ %x
định dạng của printf .
Mã trên in 0 0 0 af
trên máy của tôi (máy x86_64, sử dụng thứ tự byte cuối ít), là hex cho 175.