关于SimpleMsgPack中swap引发的问题大端法和小端法研究笔记
今天diocp裙中[珠海]-芒果反应了一个关于SimpleMsgPack的问题
msgPack.AsFloat = 2.507182;
经过编码再解码后,会直接触发异常。
因为msgPack的标准,在打包的数据是大端法IEEE 754
下面是msgPack的标准说明
Float format family stores a floating point number in bytes or bytes.
float stores a floating point number in IEEE single precision floating point number format:
+--------+--------+--------+--------+--------+
| 0xca |XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX
+--------+--------+--------+--------+--------+ float stores a floating point number in IEEE double precision floating point number format:
+--------+--------+--------+--------+--------+--------+--------+--------+--------+
| 0xcb |YYYYYYYY|YYYYYYYY|YYYYYYYY|YYYYYYYY|YYYYYYYY|YYYYYYYY|YYYYYYYY|YYYYYYYY|
+--------+--------+--------+--------+--------+--------+--------+--------+--------+
where
* XXXXXXXX_XXXXXXXX_XXXXXXXX_XXXXXXXX is a big-endian IEEE single precision floating point number
* YYYYYYYY_YYYYYYYY_YYYYYYYY_YYYYYYYY_YYYYYYYY_YYYYYYYY_YYYYYYYY_YYYYYYYY is a big-endian
IEEE double precision floating point number
小端法变大端法把自己顺序调整下就好了
在SimpleMsgPack中有一个这样的函数,可以对Double类型的数据进行交换字节数。
procedure swap64Ex(const v; out outVal);
begin
// 7F F5 B8 6F B5 0E // 0E B5 6F B8 F5 7F
PByte(@outVal)^ := PByte(IntPtr(@v) + )^;
PByte(IntPtr(@outVal) + )^ := PByte(IntPtr(@v) + )^;
PByte(IntPtr(@outVal) + )^ := PByte(IntPtr(@v) + )^;
PByte(IntPtr(@outVal) + )^ := PByte(IntPtr(@v) + )^;
PByte(IntPtr(@outVal) + )^ := PByte(IntPtr(@v) + )^;
PByte(IntPtr(@outVal) + )^ := PByte(IntPtr(@v) + )^;
PByte(IntPtr(@outVal) + )^ := PByte(IntPtr(@v) + )^;
PByte(IntPtr(@outVal) + )^ := PByte(@v)^;
end;
然后我重载了一些函数 这个函数对传入的Double进行交换字节然后返回Double类型
function swap(v:Double): Double; overload;
begin
swap64Ex(v, Result);
end;
上面这个浮点数据 2.507182,经过交换后 如果仍然用Double类型来存放会是一个NaN, 会触发一个无效的浮点型数据的异常。因为不符合小端法的IEEE规则。
经过稍微修改后正常
function swap(v:Double): Int64; overload;
begin
swap64Ex(v, Result);
end;
返回的值用Int64来存放这样就好了。
注意不要把一个不是Double类型的数据直接强制转换成Double类型,因为Double是有标准字节格式的,当然Single一样。
关于SimpleMsgPack中swap引发的问题大端法和小端法研究笔记的更多相关文章
- 大端模式&小端模式、主机序&网络序、入栈地址高低问题
一.大端模式&小端模式 所谓的“大端模式”,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处 ...
- 判断CPU是大端还是小端模式
在小端模式中,低位字节放在低地址,高位字节放在高地址:在大端模式中,低位字节放在高地址,高位字节放在低地址.big-endian和little-endian,51单片机是典型的大端模式,Intel电脑 ...
- 用C语言,如何判断主机是 大端还是小端(字节序)
所谓大端就是指高位值在内存中放低位地址,所谓小端是指低位值在内存中放低位地址.比如 0x12345678 在大端机上是 12345678,在小端机上是 78564312,而一个主机是大端还是小端要看C ...
- 转!大端模式&小端模式
大端模式&小端模式 在C语言中除了8位的char型之外,还有16位的short型,32位的long型(要看具体的编译器),对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器 ...
- 关于byte[]字节传输的大端和小端小议
当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题,于是端(endian)的问题应运而生了,对于不同的存储方法,就有大端(big-en ...
- 【转】如何判断CPU是大端还是小端模式
原文网址:http://blog.csdn.net/ysdaniel/article/details/6617458 如何判断CPU是大端还是小端模式 http://blog.sina.com.cn/ ...
- C++将整型数据转换成大端或小端存储顺序
大端和小端的概念参考之前博客: 大端/小端,高字节/低字节,高地址/低地址,移位运算 昨晚帮导师从指令中恢复图像的时候,导师要我转换成raw格式,也就是记录图像像素的二进制序列,然后反复强调让我注意大 ...
- 大端和小端(Big endian and Little endian)
一.大端和小端的问题 对于整型.长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian 则相反,它 ...
- 大端和小端(big endian little endian)
一.大端和小端的问题 对于整型.长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian 则相反,它 ...
随机推荐
- 10行代码解析krc歌词文件
互联网上,我们常见的歌词格式有 LRC.TRC(天天动听歌词).KRC(KuGou ResourCe,酷狗资源文件)和 QRC(QQ音乐歌词):在影视制作中,人们通常会用其他的卡拉 OK 字幕格式,例 ...
- mysql--SQL编程(基础知识) 学习笔记1
1.数据库应用类型分类: 一般来说,可将数据库的应用类型分为OLTP(OnLine TransactionProcessing ,联机事务处理)和OLAP(OnLine Analysis Proces ...
- 使用 Cobbler 自动化和管理系统安装
设置一个网络环境可能涉及到许多步骤,才能为开始安装做好准备.您必须: 配置服务,比如 DHCP.TFTP.DNS.HTTP.FTP 和 NFS 在 DHCP 和 TFTP 配置文件中填入各个客户端机器 ...
- UCP规模估算方法介绍 基于UCP方法的软件项目成本估计及其应用方法,软件,项目,UCP方法,应用,项目估算及软件及应用,软件估算,项目成本,软件项目
基于UCP方法的软件项目成本估计及其应用 UCP说明: UCP = 交易的UCP数 + Actor的UCP数,1.交易/Actor在估算时按复杂度分为简单.普通.复杂.主观类别,权重分别对应1.2.3 ...
- 树莓派进阶之路 (013) - 树莓派2/3 C语言使用PWM
我手里面的是树莓派3,系统是Raspbian官方操作系统,已经安装好了wiringPi. PWM简介:脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平 ...
- php 执行命令函数
/** Method to execute a command in the terminal Uses : 1. system 2. passthru 3. exec 4. shell_exec * ...
- CocoaPods iOS 开源库管理
1.CocoaPods 简介 1.1 CocoaPods CocoaPods 是 macOS 和 iOS 下的一个第三类库管理工具,通过 CocoaPods 工具我们可以为项目添加被称为 " ...
- Oracle 12C -- top-n查询新特性
Oracle 12C -- top-n查询新特性在12C中,增加了一些新的特性.可以指定返回结果集的指定数量的行.或按照百分比返回行. SQL> select count(*) from emp ...
- Fix Backup Database is terminating abnormally When performing a Farm Backup
Problem I am trying to backup SharePoint 2013 Farm Automatically with PowerShell and Windows Task Sc ...
- GGSN与SGSN简介
GPRS核心网是GPRS(general packet radio service)系统的核心部分,GPRS的作用在于传输IP包,广泛应用于2G的GSM和3G的WCDMA网络. 1.GPRS核心网基本 ...