因为需要直接处理一个网络字节序的 32 位 int,所以,考虑用自己写的还是系统函数效率更高。然后又了下面的了解。

首先是系统函数 htonl ,我在 kernel 源码 netinet/in.h 找到如下定义:

# if __BYTE_ORDER ==__BIG_ENDIAN/*The host byte order is the same as network byte order,

so these functions are all just identity.*/# define ntohl(x) (x)

# define ntohs(x) (x)

# define htonl(x) (x)

# define htons(x) (x)

#else#if __BYTE_ORDER ==__LITTLE_ENDIAN

# define ntohl(x) __bswap_32 (x)

# define ntohs(x) __bswap_16 (x)

# define htonl(x) __bswap_32 (x)

# define htons(x) __bswap_16 (x)

# endif

# endif#endif

可以看到,如果系统是 BIG_ENDIAN 那么网络字节序和运算字节序是一致的,如果是 LITTLE_ENDIAN 那么需要进行 __bswap_32() 操作。__bswap_32() 在 gcc 中实现,位于bits/byteswap.h(不要直接引用此文件;使用 byteswap.h 中的 bswap32 代替):

/*Swap bytes in 32 bit value.*/

#define __bswap_constant_32(x) \((((x)& 0xff000000u) >> 24) | (((x) & 0x00ff0000u) >> 8) |\

(((x)& 0x0000ff00u) << 8) | (((x) & 0x000000ffu) << 24))

如果 CPU 直接支持 bswap32 操作,那这里该用汇编来写? 以提高效率。

网络上是一个个字节传的,而 int 是 32 位,所以,我又定义了这个 union:

union

{

unsignedintber32;char mem[4];

} currentData;

这样,就直接把各个 byte 给直接取出来了。

所以,按这个思路,完整的过程就是:

#if BYTE_ORDER == BIG_ENDIAN

#warning "BIG_ENDIAN SYSTEM!"currentData.ber32=sampleValue;#elif BYTE_ORDER == LITTLE_ENDIAN

#warning "LITTLE_ENDIAN SYSTEM!"currentData.ber32=bswap_32(sampleValue);#else

#error "No BYTE_ORDER is defined!"

#endifsendBuf[bufPos++] = currentData.mem[0];

sendBuf[bufPos++] = currentData.mem[1];

sendBuf[bufPos++] = currentData.mem[2];

sendBuf[bufPos++] = currentData.mem[3];

从网络字节序取出数值时候,赋值和 bswap 过程反一下就好。

从网络字节序直接恢复出数值的另一个思路是,既然网络字节序是确定的,那么可以用移位累加的方法直接求出这个 int,如下:

sampleValue = 0;

sampleValue += (buff[posOfSamples + 0] << (8 * 3)) );

sampleValue += (buff[posOfSamples + 1] << (8 * 2)) );

sampleValue += (buff[posOfSamples + 2] << (8 * 1)) );

sampleValue += (buff[posOfSamples + 3] << (8 * 0)) );

虽然后面一个比 bswap 多几个 cpu 时间,但是,明显可读性要高一些。

java ntohl 类似函数_关于 htonl 和 ntohl 的实现相关推荐

  1. java 大小写转换函数_不使用Java中的任何库函数将大写转换为小写

    java 大小写转换函数 Given a string and we have to convert it from uppercase to lowercase. 给定一个字符串,我们必须将其从大写 ...

  2. java调用javascript函数_[Java教程]JavaScript函数的4种调用方法详解

    [Java教程]JavaScript函数的4种调用方法详解 0 2016-08-09 00:00:12 在JavaScript中,函数是一等公民,函数在JavaScript中是一个数据类型,而非像C# ...

  3. java编写一个函数_请教如何用java编写一个函数图像生成的应用程序?谢谢!

    展开全部 package math; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayo ...

  4. java调用javascript函数_使用Java程序中的参数调用Javascript函数

    我有Java Swing应用程序.当用户点击MenuItem时,我想使用JavaScript在HTML页面上显示图形. Java代码: if(e.getActionCommand().equals(& ...

  5. java求根号函数_一般实系数四次方程的一种求根公式与根的判别法则及其推导...

    仿照<方程式论>( 伯恩赛德班登 著),我们设四次方程的一般形式为: 方程两边同除以 ,然后作代换: 我们有: 令: 那么有: 我们假设 ,然后求解方程 . 设: 代入方程 并整理,我们有 ...

  6. java socket 回调函数_请问Java网络编程如何在不使用多线程的情况下实现异步返回?...

    我指的是在不使用多线程的情况下进行并发处理 具体的情况是,在不使用多线程的情况下,服务器侦听某个端口,在有连接进来的时候会调用某个函数对此连接进行处理,但是由于处理的过程可能会比较长,为了不让后面连接 ...

  7. Java dectobin(n)函数_浙大JAVA实验题答案09answer.docx

    实验9-1 Method的使用(二) 程序填空题,不要改变与输入输出有关的语句. 50010十进制转换二进制 输入一个正整数repeat (0 输入1个正整数n,将其转换为二进制后输岀. 要求定义并调 ...

  8. java中主函数_(基础)java中的主函数

    Java中的主函数 1.由JVM调用:JVM通过类名直接调用主函数(静态方法) 2.主函数的形参是一个字符串数组: String[] args 3.运行主函数时,如果没有向其传递参数,JVM会自动创建 ...

  9. java的mergesort函数_归并排序 - Algorithms, Part I, week 3 MERGESORTS

    前言 本周讲解两个50多年前发明,但今天仍然很重要的经典算法 (归并排序和快速排序) 之一 -- 归并排序,几乎每个软件系统中都可以找到其中一个或两个的实现,并研究这些经典方法的新变革.我们的涉及范围 ...

最新文章

  1. javascript网页开发 第二章
  2. “华为云杯”2020深圳开放数据应用创新大赛线上推介会成功举办,让深圳大数据在全球“跑”起来...
  3. Jmeter(七)-参数化
  4. delphi中的函数传参如何传枚举参数_shell脚本的函数介绍使用和工作常用案例。建议收藏...
  5. ASP程序快速生成Excel文件
  6. 有没有那种python在线编译器_推荐几个好用的在线编译器
  7. 2008年毕业生第一份工作月薪工资大曝光
  8. layui多文件选择之后自动上传
  9. 基于Websocket草案10协议的升级及基于Netty的握手实现
  10. 理解快速傅里叶变换(FFT)算法
  11. JavaScript:执行机制
  12. 【求救】如何调用Windows系统自带的“选择用户”、“选择组”的对话框?
  13. linux文件系统之mount流程分析
  14. excel2019关闭后有残留进程_农药残留检测仪电路设计方案(原理图+PCB+BOM)
  15. Codesys提示【CmContainer/Wibukey runtime system is not installed】的解决方法
  16. ppt背景图片php,ppt背景图片怎么设置 ppt幻灯片制作视频
  17. 3D建模初学者必看!你想要的学习工具都在这了!
  18. .db-shm和.db-wal文件
  19. DataWhale组队学习——DCIC赛事 task1
  20. MySQL数据库实验(四):E-R图实例讲解

热门文章

  1. 我用Python发现了 十二星座 中的秘密(附视频)
  2. 木马和病毒有何区别?
  3. java雀圣麻将游戏,《雀圣宝典》麻将必看攻略
  4. 本地 Services(服务)
  5. 模板引擎FreeMarker的介绍和使用
  6. ubuntu下PPA相关的各类问题解决
  7. XP中i386/lang的文件夹下载
  8. linux 下载文件放哪里,请问是用Yum install命令安装时下载的文件包放在哪里了?...
  9. 小二读西游-法术学习哪家强,三星洞,须菩提
  10. 计算机网络期末复习总结