LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1314|回复: 6

16进制变量相加的问题

[复制链接]
发表于 2010-5-12 17:35:22 | 显示全部楼层 |阅读模式
请教,我是个新手,我写了个脚本用来计算一个偏移后的地址,要把得到的两个16进制整数相加,该如何实现??
基地址变量是 $base
偏移量变量是 $off
他们都是16进制格式的整数,但是却没有'0x'头。而且还可能前面有0

比如 $off=0009c21d

最后还需要把相加得到的结果以 0x???????的形式打印在屏幕上。

我不知道该如何做,请高人指教,谢谢了先。
 楼主| 发表于 2010-5-12 17:59:58 | 显示全部楼层
自己探索出一种很笨的方法,不知道有没有更优化的方法。我的写法如下:

addr=`echo 0x$base 0x$off | awk --non-decimal-data '{sum=($1+$2); printf("%X", sum);}'`
echo 0x$addr
回复 支持 反对

使用道具 举报

发表于 2010-5-12 22:52:17 | 显示全部楼层
若是bash可用bc
  1. echo "ibase=16;obase=16;2334+432423"|bc
复制代码
回复 支持 反对

使用道具 举报

发表于 2010-5-13 02:40:21 | 显示全部楼层
  1. printf 0x"%08x" $((0x$base+0x$off))
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-5-21 11:14:53 | 显示全部楼层
感谢各位达人的解答。各位只帮我实现了打印在屏幕上,忽略了我另一个需求,我要把它先保存在一个变量里面。
打印的话是后面的需求,就是脚本运行到一定的时候,要给用户一些提示的时候才会打印这个信息。但这个变量是要一直使用的。
不过用各位的这个打印的方法再联合awk也能实现保存到变量。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-5-21 11:25:58 | 显示全部楼层
试了一下这个法子,直接用
add=`printf 0x"%08X" $((0x$base+0x$off))` 可行
可笑我对shell编程不熟悉,最开始以为像C函数那样去调printf,还使用了()
另外就是后面的$((0x$base+0x$off))一定要是两层(),一层的话就是xxx+xxx的字符串,两层才会求和。
终于算是弄明白了,谢谢。
回复 支持 反对

使用道具 举报

发表于 2010-5-21 22:48:02 | 显示全部楼层
Post by kerlw;2091450
试了一下这个法子,直接用
add=`printf 0x"%08X" $((0x$base+0x$off))` 可行
可笑我对shell编程不熟悉,最开始以为像C函数那样去调printf,还使用了()
另外就是后面的$((0x$base+0x$off))一定要是两层(),一层的话就是xxx+xxx的字符串,两层才会求和。
终于算是弄明白了,谢谢。

只需:

  1. add=$((0x$base+0x$off))
  2. ...
  3. printf 0x"%08X" $add
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表