C/C++ 实现htonf和ntof的两种方法
来源:互联网 发布:网络杀毒软件logo 编辑:程序博客网 时间:2024/06/01 13:16
数字在计算机中两种储存数据的方式:1. Little endian:将低序字节存储在起始地址;2. Big endian:将高序字节存储在起始地址。一般来说主机序是小端的,网络序是大端的。htonl、htons和ntohl、ntohs是常见的函数,htonl、htons用于32位何16位数据小端字节序到大端字节序的转换,ntohl、ntohs用于32位何16位数据大端字节序到小端字节序的转换。
htonl、htons和ntohl、ntohs都比较常见。大小端数据转换的根本方法就是对数据位置换位。htonff和ntohf的实现如下:
方法一:
#include <stdint.h>uint32_t htonf(float f){ uint32_t p; uint32_t sign; if (f < 0) {// Get sign. sign = 1; f = -f; }else { sign = 0; } p = ((((uint32_t)f)&0x7fff)<<16) | (sign<<31);// Get integer part. p |= (uint32_t)(((f - (int)f) * 65536.0f))&0xffff; // Get fraction part. return p;}float ntohf(uint32_t p){ float f = ((p>>16)&0x7fff); f += (p&0xffff) / 65536.0f; if (((p>>31)&0x1) == 0x1) { f = -f; } return f;}如果实现了htonl和ntohl的基础基础上就非常容易实现了。
方法二:
uint32_t htonf(float f){ uint32_t * p_tmpu32 = (uint32_t *) &f; return htonl(p_tmpu32);}float ntohf(uint32_t p){ uint32_t tmpu32 = ntohl(p); float *p_tmpfloat = (float *)&tmpu32; return (*p_tmpfloat);}方法一的通用性比较强。在没有指针的语音中,例如java,python等可以参考方法1的思路来实现。方法二使用了c指针的强制类型转换的方法,再调用库函数,目的是保留原来数据内容不要改变。
0 0
- C/C++ 实现htonf和ntof的两种方法
- C语言实现斐波那契数列的两种方法(递归和迭代)
- c实现 求一个数组中最大子序列的和 (两种方法)
- c语言strstr实现的两种方法
- C++_队列的两种实现方法
- C语言实现对半法查找的两种方法
- C语言 实现两种排序方法
- C#:定义常量的两种方法
- C语言两种方法实现字符串反转
- C语言两种方法实现进程间 socket 通信
- c语言:两种方法实现字符串拷贝strcpy
- Linux C 两种方法实现复制拷贝文件
- 杨辉三角形(pascal triangle)的两种不同思路的C实现方法
- 杨辉三角形(pascal triangle)的两种不同思路的C实现方法
- C++Builder下实现对端口读写的两种方法(转)
- 用C++实现十进制到十六进制的两种转换方法
- n皇后问题的两种递归方法C语言实现
- Linux平台上C语言实现异步队列的两种方法
- Wireshark理解TCP乱序重组和HTTP解析渲染
- 请立即更新您的iPhone和iPad,间谍工具将会控制其系统漏洞
- ABAP学习笔记
- 指针函数 与 函数指针
- linux查看各个文件大小
- C/C++ 实现htonf和ntof的两种方法
- spring mybatis整合
- 公司内部Wiki,你建立了么?
- mysql下实现窗口分析函数
- MQTT消息协议、服务器及其客户端
- Android7.0 添加快速设定Quick Settings Tile
- 文本数据分析神器—— IBM BigInsights Text Analytics
- android极光推送
- Leetcode-239. Sliding Window Maximum