2009-01-07 8 views

Trả lời

9

Có, bạn cần trao đổi chúng.
Các byte sẽ được truy lục từ việc truyền tải theo cùng thứ tự mà chúng được đưa vào. Chỉ cần ở đầu kia thứ tự của các byte này có ý nghĩa khác. Vì vậy, bạn cần phải chuyển đổi chúng thành đúng endian-ness (là một từ?).

Phương pháp đã thử và đúng là chuyển đổi sang thứ tự byte mạng trước khi vận chuyển. Sau đó chuyển đổi trở lại để lưu trữ thứ tự byte cụ thể (từ thứ tự byte mạng) khi nhận được.

Một tập hợp các chức năng để giúp đỡ với chuyển đổi endian:

ntohs Convert a 16-bit quantity from network byte order to host byte order 
ntohl Convert a 32-bit quantity from network byte order to host byte order 
htons Convert a 16-bit quantity from host byte order to network byte order 
htonl Convert a 32-bit quantity from host byte order to network byte order 

Chỉ cần thêm một lưu ý cảnh cáo.
Các hệ thống khác nhau sử dụng kích thước khác nhau cho wchar_t vì vậy không giả sử sizeof (wchar_t) == 2.

Ngoài ra, mỗi máy chủ có thể sử dụng định dạng biểu diễn khác cho wchar_t.
Để giúp giải quyết vấn đề này, hầu hết các hệ thống chuyển văn bản sang định dạng đã biết để vận chuyển (UTF-8 hoặc UTF-16 là các lựa chọn tốt). Chuyển đổi văn bản trở lại định dạng máy chủ lưu trữ cụ thể ở đầu bên kia.

Bạn có thể xem icu của IBM này có tất cả chức năng này.

+1

Có thể tốt hơn là luôn chuyển đổi mọi thứ thành thứ tự byte mạng là bao gồm cờ thứ tự byte trong giao thức mạng của bạn. Bằng cách đó, máy chủ có thể gửi thứ tự byte gốc của nó (giảm tải trên máy chủ) và khách hàng có thể xác định xem họ có cần chuyển đổi tin nhắn hay không. –

+1

@len: Có thể. Nhưng máy chủ không phải là nút cổ chai. Do đó, một thiết kế giao thức thận trọng sẽ dỡ bỏ công việc cho các máy khách được nạp ít hơn, ngụ ý các máy khách nên chuyển đổi dữ liệu sang một định dạng máy chủ thuận tiện. Điều này không hàm ý thứ tự byte mạng nhưng có nghĩa là cờ thứ tự byte không phù hợp. –

0

Có, bạn cần thực hiện chuyển đổi cuối cùng. Xác định cẩn thận định dạng tuần tự hóa của bạn, tức là thứ tự byte dữ liệu được truyền qua mạng hoặc được lưu trữ trong một tệp đĩa. Sau đó, khi gửi dữ liệu, chuyển đổi từ định dạng gốc sang dạng dây (có thể hoặc không yêu cầu hoán đổi byte) và khi nhận dữ liệu, chuyển đổi từ dây sang định dạng gốc (lại có thể hoặc không yêu cầu hoán đổi byte). Bạn nên chọn định dạng dây sẽ được đa số khách hàng sử dụng để giảm thiểu số lượng chuyển đổi byte trung bình.

5

Chuyển đổi cuối cùng không đủ và do đó không cần thiết. Sizeof (wchar_t) khác nhau, và do đó mã hóa quá. Do đó, bạn cần phải đồng ý về một định dạng trao đổi. Sự lựa chọn hợp lý là UTF-8. Nhưng vì UTF-8 là định hướng byte, bạn không còn vấn đề về cuối cùng nữa.