Bash/shell 随机一个内存地址 字符串,例如ab12cd34,如何对其倒数第三位进+1操作,即想得到ab12ce34

我是用一个变量 存储随机获取的字符串地址, 想通过一个规则将这个字符串的末尾两位清零后再将倒数第三位进行+1操作, 希望大神 速速出现! 可追加赏分。


addr=ab12cd34
len=${#addr} #取字符串长度
let pos=len-3 #取得倒数第三位字符的位置index(字符index从0开机计算)
head=${addr:0:pos} #取得倒数第三位前的所有字符(从第一个字符开始取pos个字符)
str=${addr:pos:1} #取得倒数第三位字符(从pos开始取1位字符)
num=`printf "%d\n" "0x$str"` #十六进制转十进制
let num+=1
str=`printf "%x\n" $num` #十进制转十六进制
addr=${head}${str}"00"
echo $addr

  

PS:楼上的方法很简洁,利用了awk内置函数strtonum完成了十六进制到十进制的转换。

再将末尾两位清零:

echo ab12cd34|awk '{printf ("%x\n", strtonum("0x"$0) + 0x100)}'|sed 's/..$/00/'

 或者:

echo ab12cd34|awk '{printf ("%x\n", and(strtonum("0x"$0) + 0x100, 0xFFFFFF00))}'

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-07-26
你举的例子中的应该是指低位上第2个字节加1,而且最后1个字节没有变化
可以这样做:
把ab12cd34换成任意你准备好的16进制字符串
echo ab12cd34 | awk '{printf ("%x\n", strtonum("0x"$0) + 0x100)}'

输出结果就会变成 ab12ce34

如果要清零最后一个字节的话,就改成这样:
echo ab12cd34 | awk '{printf ("%x\n", strtonum("0x"$0) + 0x100 - and(strtonum("0x"$0), 0xf))}'

这样的话结果就是 ab12ce00追问

你给出的命令  结果为 ab12ce30 ; 我目前还看不懂 你给出的规则,但是想得到ab12ce00 需要修改哪里呢?

追答

不好意思,我前面漏打了一个字符
应该是
echo ab12cd34 | awk '{printf ("%x\n", strtonum("0x"$0) + 0x100 - and(strtonum("0x"$0), 0xff))}'

其实原理很简单,假设输入数字是n,
那么a = n + 0x100 就是在低位的的第二个字节加1,
b = n & 0xff 就是低位的一个字节
两者相减a-b 就是 第二个字节加1,再将最后一个字节清零

本回答被网友采纳
第2个回答  2013-07-26
你这个问题也只能等待大神回答你了...
相似回答