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

minipig520 2011-08-02 03:27:12
str := format('%x%x',[data[5],data[4]]);
data[5],data[4] 是串口发回的指令 前面表示高位 后面表示低位
比如str中现在存储的是‘526E’
我的想法是将字符一个一个取出来按数学方法计算再相加
怎么实现呢?
...全文
459 27 打赏 收藏 转发到动态 举报
写回复
用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)
ASCII 十六进制 转换工具 简单计算器:可进行简单的四则运算,支持小键盘输入! 进制转换:数值型的常用进制的相互转换: (2、8、16)10 及 216 说明:由于数值型转换函数为自行编写,所以支持包括小数部分. (适用于计算器等级考级的笔试基础题) 字符转换: 可转换多个字符为ASCII码(十进制)及十六进制,且可加入前置及后置字符。 字符转ASCII(即字符的十进制): 其中字符转换为ASCII码中,如果字符为汉字(即双字节) 可选择:正数、负数或者字节分离三种表示方式 利如汉字"中" 正数:54992 负数:-10544 字节分离:214,208 说明: 如果包含汉字字符,且选了负数或字节分离表示方式, 请不要使用"-"或","来作为前、后置符,以免逆操作时引起错误 ASCII转字符:就是上面的逆操作,这时只要输入对应的ASCII码就能转换为字符 说明: 1.由于本程序有判断功能,所以可不用选择汉字表达方式, 即您输入54992或-10544或214,208都能转换为汉字"中" 2.如果进行待逆操作的ASCII码包含分隔,请必须在前置和后置符框输入对应字符 例如:%-15133;%-17725;想逆向转为字符,须在前置符填入% 后置符填入; %-15133 %-17725 则前置符填入% 后置符输入空格 注意要转为字符的对应数值一定有要间隔符 例如:%-15133%-17725是没法进行转换的,而应该像上面一样改为%-15133 %-17725 即间隔至少(默认)为空格符 字符转换为十六进制及其逆操作与上面基本相同 说明:例如在前置符加了%即可求UTF-8值 键盘ASCII查询:可查键盘按键的十进制与十六进制值。 (例如可查询F1-F12,Shift,Ctrl,Alt,回车,退格等键值) 字符与Base64互转:字符与Base64编码的互转,可自定义密钥,以达到简单的加密! 子网划分辅助: IP转二进制:把IP地址或子网掩码转化为二进制形式. 二进制数操作:把上面转化到的IP二进制进行取反、与、或操作。 说明:普通二进制(即没有包括".")也可进行操作。 IP二进制转十进制:即把上面得到的二进制结果重新转换为十进制方式。 常见问题: 1.问:“进制转换”与“字符转换”都具有转为十六进制的操作,有何不同? 答:“进制转换”只能转换数值型,而“字符转换”是把该字符串一位一位 分别当作字符来转换! 2."字符转换"中想把对应的值转化为对应的字符,如果包括分隔符,需要手工 填入。 (详见上面的:ASCII转字符) 3."字符转换"中点击“键盘的ASCII查询”(即有键盘图标的那个按钮后) 该按钮会自动隐藏,然后可按键盘键来得到对应的值 查询完毕,可单击下面的状态栏恢愎(键盘图标的那个按钮出现) 4.关于子网划分辅助的使用: 在这里给予一段(黑客X档案中iqst)如何利用子网掩码得到网络、主机地址的文章节选: 如下: 如何用子网掩码得到网络、主机地址 (1)将IP地址与子网掩码转换成二进制; (2)将二进制形式的IP地址与子网掩码做“与”运算,将答案化为十进制便得到网络地址; (3)将二进制形式的子网掩码取“反”; (4)将取“反”后的子网掩码与IP地址做“与”运算,将答案化为十进制便得到主机地址。 通过上面的一段大家应该有所了解了,如果还不太明白可勾选“示范”来查看。 我把上面操作的各个模块都独立出来而不是一步求出结果, 目的是让大家能更方便的使用各个步聚来完成类似的需求!

5,386

社区成员

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

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