社区
Delphi
帖子详情
字符串存储的是16进制小数怎么转为10进制小数
minipig520
2011-08-02 03:27:12
str := format('%x%x',[data[5],data[4]]);
data[5],data[4] 是串口发回的指令 前面表示高位 后面表示低位
比如str中现在存储的是‘526E’
我的想法是将字符一个一个取出来按数学方法计算再相加
怎么实现呢?
...全文
504
27
打赏
收藏
字符串存储的是16进制小数怎么转为10进制小数
str := format('%x%x',[data[5],data[4]]); data[5],data[4] 是串口发回的指令 前面表示高位 后面表示低位 比如str中现在存储的是‘526E’ 我的想法是将字符一个一个取出来按数学方法计算再相加 怎么实现呢?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
27 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
minipig520
2011-08-03
打赏
举报
回复
我最笨的算法是将526E一个一个取出来 先取5 5除以16等于0.3125 再取2 2除以16的平方得0.0078
取6 6除以16的三次方 得0.0015 取E转换成十进制的14 14除以16的四次方 得0.0002 再把得到的这四个数相加 得到0.322 0.322*2=0.644显示在EDIT中
minipig520
2011-08-02
打赏
举报
回复
我写的是光机测试程序 它的协议意思就是EDIT里面输入X Y的值除以2再发送出去 光机收到后再返回16字节的16进制数 4到7字节是XY坐标值 4 6分别是XY是低位 5 7是高位
PWORD(@data[4]^) 但这样是低位在前 高位在后运算出来应该是有问题的 算的时候应该是data[5]在前data[4]在后 所以用PWORD应该不行
阿发伯
2011-08-02
打赏
举报
回复
[Quote=引用 23 楼 minipig520 的回复:]
非常感谢您的耐心!! 我再查查是什么问题 我输入的XY坐标是0.644 0.338 都是除以2后再发送出去的 我只插了个USB转串口线 收到再转回来的应该是0.322 0.169(没乘以2)
[/Quote]
0.644 0.338 0.322 0.169都是浮点数,最少要占4字节,你用2字节发浮点数,怎么还可能还原?
阿发伯
2011-08-02
打赏
举报
回复
把你的计算公式列出来,我给你用代码实现
minipig520
2011-08-02
打赏
举报
回复
非常感谢您的耐心!! 我再查查是什么问题 我输入的XY坐标是0.644 0.338 都是除以2后再发送出去的 我只插了个USB转串口线 收到再转回来的应该是0.322 0.169(没乘以2)
minipig520
2011-08-02
打赏
举报
回复
526E这两个字节 如果是一个字一个字取出来像做数学题那样计算是正确的0.322 我想的是最笨的办法
比如先取5 除以16 再取2除以16的平方。。。再依次相加 但代码中不知道怎样取 并且最后取出E又如何算
阿发伯
2011-08-02
打赏
举报
回复
PWord是双字节指针类型,将data[4]的地址赋予它后取值,就已经包含了data[5]的值。
$526e转换为十进制本就是21102,加上0.,自然是0.21102,怎么会是0.322
minipig520
2011-08-02
打赏
举报
回复
您的意思是不是很懂 str1 := '0.' + inttostr(PWord(@data[4])^);就已经包含了data[4]和data[5]2个字节内容 这怎么包含了两个字节的内容呢 这样算出来是0.212吧好像
您是说把高字节和低字节先拼在一起再算吗?
阿发伯
2011-08-02
打赏
举报
回复
[Quote=引用 18 楼 minipig520 的回复:]
str1 := '0.' + inttostr(PWord(@data[4])^);
str2 := '0.' + inttostr(PWord(@data[5])^);
edit11.Text := floattostr(strtofloat(str1)+strtofloat(str2));
这样算出来的好像有出入 正确值应该是0.322 这样算出来的是0.383
[/Quote]
怎么能向你这样将低位字节和高位字节相加?str1 := '0.' + inttostr(PWord(@data[4])^);就已经包含了data[4]和data[5]2个字节内容,没必要再相加
minipig520
2011-08-02
打赏
举报
回复
str1 := '0.' + inttostr(PWord(@data[4])^);
str2 := '0.' + inttostr(PWord(@data[5])^);
edit11.Text := floattostr(strtofloat(str1)+strtofloat(str2));
这样算出来的好像有出入 正确值应该是0.322 这样算出来的是0.383
minipig520
2011-08-02
打赏
举报
回复
因为我是初学delphi 能不能拜您为师呀...
minipig520
2011-08-02
打赏
举报
回复
有高位和低位之分 不就直接把高位忽略了?
阿发伯
2011-08-02
打赏
举报
回复
那没必要转换为浮点数,直接转换为字符串就行了:
xEdit.text := '0.' + IntToStr(PWord(@data[4])^);
yEdit.text := '0.' + IntToStr(PWord(@data[6])^);
minipig520
2011-08-02
打赏
举报
回复
没有 别的没问题呀 是这样的 data[4]X坐标的低位 data[5]X坐标高位 data[6]Y坐标低位 data[7]
Y坐标高位 我是想把X Y的值 在两EDIT中显示出来
阿发伯
2011-08-02
打赏
举报
回复
Delphi库文件坏了???
minipig520
2011-08-02
打赏
举报
回复
COM3 Write(hex): 16(Bytes)57 00 12 00 6E 52 43 2B 00 40 00 00 00 00 00 80
COM3 Read(hex): 16(Bytes) 57 00 12 00 6E 52 43 2B 00 40 00 00 00 00 00 80
6E 52 43 2B就是data4到7的数据 收到的不是0哦 我也搞不清楚为什么V值会是0 觉得很奇怪
阿发伯
2011-08-02
打赏
举报
回复
[Quote=引用 9 楼 minipig520 的回复:]
我在内存中查看data[4]中存储的是110
[/Quote]
110就是十六进制$6e
阿发伯
2011-08-02
打赏
举报
回复
怎么可能是0,这段代码运行结果为0.21102。除非你接收的字节本就为0。
minipig520
2011-08-02
打赏
举报
回复
我在内存中查看data[4]中存储的是110
minipig520
2011-08-02
打赏
举报
回复
[Quote=引用 7 楼 maozefa 的回复:]
其实,你先将整形字节转换为字符串是多此一举,可直接转换的,如:
Delphi(Pascal) code
var
data: array[0..7] of byte;
v: double;
begin
data[4] := $6e; // 模拟串口发回数字
data[5] := $52;
v := StrToFloat('0.' + IntToStr(P……
[/Quote] 我搞不清楚为什么我这样写的话V的值会是0
加载更多回复(7)
两种方法实现:labview中4位
16进制
字符串
转
10进制
小数
符合IEEE754标准。 可以将4位
16进制
字符串
转
10进制
小数
。 如3ED80000
转为
0.421875。
pb
字符串
转十六进制及各进制之间转换源码
powerbuilder 9
字符串
转换进制源码
易语言
小数
转十六进制
易语言
小数
转十六进制源码,
小数
转十六进制,
小数
到十六进制,十到二
16进制
浮点数转换为
10进制
VC代码
VC编程实现
16进制
浮点数转换为
10进制
,转换源代码,实验测试代码没有问题。符合IEEE754协议标准。
十六进制
字符串
到浮点数,整型的相互转换源代码(qt+vc2010)
新手一枚,最近项目需要十六进制
字符串
到浮点数的转换,查找参考一些相关资料,顺带整理了一下,就分享出来了。
Delphi
5,930
社区成员
262,936
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章