2011-12-13 32 views
13

Tôi đang làm việc với một số mã cũ và tôi bắt gặp một hàm được sử dụng để thực hiện chuyển đổi thứ tự byte mạng trên trường dài tùy ý (lớn hơn ntohl có thể xử lý).Điều này thực sự làm gì? - Chức năng Crazy C++

Tôi không thể hiểu nó đủ tốt để biết nếu nó làm bất cứ điều gì nhiều hơn đảo ngược thứ tự byte trên phạm vi bộ đệm msg mặc dù (hoặc thậm chí nếu nó sẽ làm điều đó đáng tin cậy). Ai đó có thể giúp tôi phá vỡ điều này và phân tích nó để tôi có thể thay thế nó bằng cái gì đó dễ hiểu hơn (hoặc ít nhất là bình luận tốt) !?

void swapit(unsigned char *msg, int length) { 
    for(;length>0;length--, msg++) { 
    *msg = ((*msg * 0x0802LU & 0x22110LU) | 
      (*msg * 0x8020LU & 0x88440LU)) * 
      0x10101LU >> 16; 
    } 
} 
+3

Xem http://stackoverflow.com/a/746203/367273 nơi chức năng này xuất hiện cùng với nhiều lựa chọn thay thế. Bỏ phiếu để đóng trên cơ sở đó. – NPE

+0

Erm ... tôi có nên coi đó là "nó hoàn toàn an toàn và không lo lắng về nó?" –

+1

Điều đó tùy thuộc vào bạn. Nó rõ ràng xứng đáng một bình luận (và có lẽ một liên kết đến câu hỏi SO khác? :-)) – NPE

Trả lời

20

Để xem cách hoạt động, hãy xem xét áp dụng các thao tác với mẫu bit abcdefgh. Tôi sẽ trình bày các số nhị phân với . cho 0, vì vậy các bit khác không nổi bật.

Các subexpression đầu tiên là:

........ ........ abcdefgh 
* ........ ....1... ......1. (0x0802) 
= .....abc defgh..a bcdefgh. 
& ......1. ..1....1 ...1.... (0x22110) 
= ......b. ..f....a ...e.... 

Thứ hai là:

........ ........ abcdefgh 
* ........ 1....... ..1..... (0x8020) 
= .abcdefg h..abcde fgh..... 
& ....1... 1....1.. .1...... (0x88440) 
= ....d... h....c.. .g...... 

Kết hợp chúng và nhân với hằng số chính thức cho phép:

......b. ..f....a ...e.... 
| ....d... h....c.. .g...... 
= ....d.b. h.f..c.a .g.e.... 
* .......1 .......1 .......1 (0x10101) 
= ....d.b. h.f..c.a .g.e.... 
+h.f..c.a .g.e.... ........ 
+.g.e.... ........ ........ 
= hgfedcba hgfe.c.a .g.e.... 

Cuối cùng chuyển xuống 16 bit cung cấp cho hgfedcba, mặt sau của mẫu gốc.

+0

Cảm ơn câu trả lời chi tiết, nó làm cho nó dễ hiểu hơn rất nhiều :) –

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