字符串存储的是16进制小数怎么转为10进制小数

minipig520 2011-08-02 03:27:12
str := format('%x%x',[data[5],data[4]]);
data[5],data[4] 是串口发回的指令 前面表示高位 后面表示低位
比如str中现在存储的是‘526E’
我的想法是将字符一个一个取出来按数学方法计算再相加
怎么实现呢?
...全文
493 27 打赏 收藏 转发到动态 举报
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)

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧