htonl函数 -- 百度笔试题之一

约定不等于承诺〃 2022-05-14 13:48 217阅读 0赞
  1. 这个是个字节序转换函数,具体的比较多,我就摘抄了,反正是一个转换而已,不是简单的转为网络字节,主要是因为主机字和网络字,字序不同~
  2. htonl就是把本机字节顺序转化为网络字节顺序
  3. 所谓网络字节顺序(大尾顺序)就是指一个数在内存中存储的时候“高对低,低对高”(即一个数的高位字节存放于低地址单元,低位字节存放在高地址单元中)。
  4. 但是计算机的内存存储数据时有可能是大尾顺序或者小尾顺序。
  5. 先举个例子:
  6. int a = 0x403214;
  7. int b = htonl(a);
  8. 我在VC++6.0调试这段代码,发现
  9. &a的值为:0x0012ff44
  10. 其中0x0012ff440x0012ff450x0012ff460x0012ff47这四个单元的值依次为:14324000
  11. 0x403214这个数的高位部分存放在高位地址中,低位部分存放在低位地址中,即小尾顺序。
  12. &b的值为:0x0012ff40
  13. 其中0x0012ff400x0012ff410x0012ff420x0012ff43这四个单元的值依次为:00403214
  14. 即把原数0x403214的高位部分存放在低位地址中,低位部分存放在高位地址中。
  15. 由此可见,如果一个数以小尾顺序存储,经htonl函数调用后这个数的高地位字节会完全颠倒过来成为一个新的数。
  16. 这个新的数在机器内部其实还是以小尾顺序存储的,但是相对于原来的数而言相当于是变成大尾顺序的了。
  17. long型的0x40写完整为:0x 00 00 00 40,共四个字节,调用htonl后四个字节颠倒顺序,为0x 40 00 00 00
  18. 同样,0x40 00 00 00调用htonl后变为0x 00 00 00 40,即0x40

追问

  1. 没回答道点上。我知道这个函数的作用,就是卡在中间了,没搞明白这个函数就是对IP地址和端口号进行转换,这和要传输的数据有什么关系

回答

  1. 这玩意转的就是排序序列,不同操作机的排序方法大排序的读取字节序列方式不同,这个可以去查一查主机字节顺序和网络字节顺序,
  2. 主要区别也就是起始地址存的是低序还是高序,不同的方式读取的顺序也不同,因此如果使用高序方法去读取低序字节,
  3. 获取出的数据就不是需要的数据,(因为基本上读取反掉了),所以需要经过转换,这个函数是只针对IP和端口的,
  4. 因为从网络上来的一般是高字节序,要经过这个函数转为本机序,才能保证获取到的IP和端口是正确的

发表评论

表情:
评论列表 (有 0 条评论,217人围观)

还没有评论,来说两句吧...

相关阅读

    相关 运营试题

    目一: 如果你现在是一个创业型公司的运营总监,产品选取的创业方向是视频方向;众所周知,视频是竞争非常激烈的一个领域,请描述你的产品运营思路,如何在红海中竞争。 要求:...