Kor*_*gay 1 c sockets ip bit-manipulation
我正在研究FreeBSH开发人员手册,在那里我看到了这个用于Socket编程的代码:
struct sockaddr_in sa;
sa.sin_addr.s_addr = htonl((((((192 << 8) | 43) << 8) | 244) << 8) | 18);
Run Code Online (Sandbox Code Playgroud)
为什么按位移位和/或在这里使用?
我知道什么是按位移位和xor,我做了一个非常小的测试程序:
int c = 5;
printb(c);
int d = 5<<2;
printb(d);
int e = d | c;
printb(e);
Run Code Online (Sandbox Code Playgroud)
打印:
00000000000000000000000000000101
00000000000000000000000000010100
00000000000000000000000000010101
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么sa.sin_addr.s_addr我需要移动ip和/或它以下值.谁能解释一下?
它正在为IP 192.43.244.18创建二进制表示.
让我们一个一个地分析每个操作.
从这些常量的二进制表示开始:
192 = 11000000
43 = 00101011
244 = 11110100
18 = 00010010
Run Code Online (Sandbox Code Playgroud)
最内在的操作:
(192 << 8) =
= 11000000 << 8 =
= 1100000000000000
Run Code Online (Sandbox Code Playgroud)
下一个:
(192 << 8) | 43 =
= 1100000000000000 |
00101011 =
1100000000101011
Run Code Online (Sandbox Code Playgroud)
下一个:
((192 << 8) | 43) << 8) =
= 1100000000101011 << 8 =
= 110000000010101100000000
Run Code Online (Sandbox Code Playgroud)
下一个:
(((192 << 8) | 43) << 8) | 244 =
= 110000000010101100000000 | 244 =
= 110000000010101100000000 |
11110100 =
= 110000000010101111110100
Run Code Online (Sandbox Code Playgroud)
下一个:
(((192 << 8) | 43) << 8) | 244) << 8 =
= 110000000010101111110100 << 8 =
= 11000000001010111111010000000000
Run Code Online (Sandbox Code Playgroud)
最后:
(((((192 << 8) | 43) << 8) | 244) << 8) | 18 =
= 11000000001010111111010000000000 | 18 =
= 11000000001010111111010000000000 |
00010010 =
= 11000000001010111111010000010010
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
302 次 |
| 最近记录: |