Bash 生成特定范围的十六进制数
我需要一种简单的方法来生成一个.txt文件,其中包含一个分号分隔的十六进制数列表,这些十六进制数介于(包括)某个起始值和结束值之间 例如: 如果我输入Bash 生成特定范围的十六进制数,bash,shell,hex,Bash,Shell,Hex,我需要一种简单的方法来生成一个.txt文件,其中包含一个分号分隔的十六进制数列表,这些十六进制数介于(包括)某个起始值和结束值之间 例如: 如果我输入0和FFF,它将用零填充输出到最大值: 000;001;002;003;004;005;006;007;008;009;00A;00B;00C;00D;00E;00F;010;011;....FFF 如果我输入FFF和1200它将输出这些值…等等: 0FFF;1000;1001;1002;.....1200; 有什么建议吗?我不是一个程序员,所以最
0
和FFF
,它将用零填充输出到最大值:
000;001;002;003;004;005;006;007;008;009;00A;00B;00C;00D;00E;00F;010;011;....FFF
如果我输入FFF
和1200
它将输出这些值…等等:
0FFF;1000;1001;1002;.....1200;
有什么建议吗?我不是一个程序员,所以最好的、最简单的方法就是超越我。这里有一个在OpenBSD上用KSH测试的实现(应该与任何Bourne shell一起使用,不依赖于
bash
特性)
关于文本文件的输出,只需使用shell重定向操作符:
$./hex-range.sh 91 FF > output.txt
我几乎完成了一些简单的命令,拼凑了一个非常简单的脚本,可以正确地填充并创建我需要的输出:
#!/bin/sh
#Script to test for loop
i=10 #put start num in here
j=20 #put end num in here
for (( a=i ; a <= j; a++ ))
do
printf '&#x%05x;' "$a" >> output.txt
done
#/垃圾箱/垃圾箱
#用于测试循环的脚本
i=10#将start num放在这里
j=20#把end num放在这里
对于((a=i;a>output.txt
完成
这里有一个脚本,它是可移植的(任何POSIX外壳都可以),应该工作得非常快(没有分叉到nawk、bc等),并且符合海报的规格
#!/bin/sh
#
# hexcount - POSIX Shell script to count from $1 to $2 in hex,
# separated by ";" and with the precision set to the
# maximum digits of $1 and $2.
# Usage: hexcount lo hi
# Example: hexcount FFF 1200
from=$1 to=$2
if test "${#from}" -gt "${#to}"; then
format="%0${#from}X;"
else
format="%0${#to}X;"
fi
from=$(printf '%d' "0x$from") to=$(printf '%d' "0x$to")
while test "$from" -le "$to"; do
printf "$format" "$from"
from=$((from+1))
done
printf '\n'
printf不是很酷吗?回复太晚了,但我们开始了。我只是想创建一个包含从0到255字节序列的文件。下面是我得到的:
for n in $(seq 0 255); do printf "\x$(echo "obase=16; $n" | bc)" >> seq.bin; done
这正是我们现在所要求的,但是我们可以很容易地找出如何更改命令来实现这一点
希望有帮助。另一种尝试(仍需要seq,但不需要bc)-在cygwin和linux中工作:
seq 0 255 | while read n; do printf "%04X;" $n; done
输入为十进制,但输出为大写十六进制,您可以通过更新printf格式字符串的“04”部分来更改显示的数字。我喜欢使用simple for循环。您可以为每个数字添加任意数量的嵌套循环:
for i in {0..9} {a..f}; do for x in {0..9} {a..f}; do for y in {0..9} {a..f}; do printf "$i$x$y;"; done; done; done
输出应如下所示:
000;001;002;003;004;005;006;007;008;009;00a;00b;00c;00d;00e;00f;010;011;012;013;014;015;016;017;018...ff8;ff9;ffa;ffb;ffc;ffd;ffe;fff;
这是一个单行线,但让我给它一些结构:
for i in {0..9} {a..f}
do
for x in {0..9} {a..f}
do
for y in {0..9} {a..f}
do
printf "$i$x$y;"
done
done
done
下面是另一个实现,它没有考虑所有原始约束(即零填充和分号分隔符),但可能对某些人有用:
bc <<< "obase=16; ibase=16; for (i = $low; i <= $high ; i++) i"
bc我只是想指出,尽管我们热爱自己的根,但有时不值得付出痛苦。考虑到输入十六进制的问题,所有的例子都有我所知道的最简单的方法来处理每种语言中的十六进制,但我的知识非常有限,所以如果你能想出更好的方法,请发表评论
要点是:使用stff,尤其是更常见的语言,因为它们可能已经作为依赖项安装在几乎所有地方…从未发现没有Ruby和/或Python的计算机,现在有了Electron,几乎每个人都有NodeJ
我使用了一行程序,并包含了直接从终端输入的语法,这类东西我保存到备忘单,只要我想使用它,就复制粘贴或键入
红宝石:
我非常了解我的Ruby,所以我会使用它,这就是为什么它如此漂亮的原因。对于任何不习惯它的人来说,结尾的;
被用作连接的参数(而put
将整个东西作为参数)。不知道为什么还有人不使用Ruby
Python(不是我的专长,我懒得在没有reduce的情况下处理加入列表项的问题,至少我希望这只是我的懒惰):
再说一次,我真的希望这只会很糟糕,因为我是一个红宝石爱好者,因为我仍然希望Python有一天会停止让我失望
JavaScript(好吧,我承认这很糟糕):
除了LISP的格式
狗屎之外,它不是最漂亮或最简洁但可读性很好的…我就到此为止,希望Clojure、Scheme、Chicken或其他什么有更好的方法来处理它
现在Ruby是我最主要的东西,我猜这个事实以及我喜欢它的原因在这个例子中非常明显:在Ruby中,你以一种非常简洁易读的方式做事情,没有不必要的转换、导入内容、声明变量等。它只是流动得很漂亮。正如@Fernandocorero在他的回答中指出的,它不是very通常不会安装另一种更先进的语言,因此,您可以使用例如python
或php来生成它,并在shell变量中设置它:
MY_SEQUENCE=$( *command* )
命令是以下命令之一:
- 在Python中
python-c'print(“;”).join(“%04X”%i代表范围内的i(0xA000,0xA0FF+1))'
范围(0xA000,0xA0FF+1)
生成从40960(0xA000)到41215(0xA0FF)的序列,
注意您可以以十进制或十六进制格式输入边界。写入0xFF或255是等效的。
注意该范围不包括上限,因此+1
%04X”%i
将序列中的每个数字格式化为至少4位的十六进制字符串(X表示大写,X表示小写)
“;”。join()连接所有这些字符串,并用“;”
printf
将结果写入标准输出
- 在PHP中
php-r'echo内爆(;),数组映射(函数($n){return sprintf(“%04X”,$n);},范围(0xA000,0xA0FF));'
范围(0xA000,0xA0FF)
生成从40960(0xA000)到41215(0xA0FF)的序列,
注意您可以以十进制或十六进制格式输入边界。写入0xFF或255是等效的
array\u map()
将给定函数应用于序列的每个编号
function($n){return sprintf(“%04X”,$n)}
将数字格式化为至少4位的十六进制字符串(X表示大写,X表示小写)
内爆(“;”,)
连接所有这些字符串,并用“;”
echo
写入
bc <<< "obase=16; ibase=16; for (i = $low; i <= $high ; i++) i"
ruby -e "puts (0xA000..0xA0FF).to_a.join ';'"
python -c 'from functools import reduce; print(reduce(lambda x,y: f"{x};{y}", range(0xA000, 0xA0FF)))'
node -e "n=0xA000,f=0xA0FF,r=[]; while(n<=f){r=r.concat(n);n++;};console.log(r.join(';'))"
sbcl --noinform --quit --eval '(print (format nil "~{~A~^;~}" (loop for n from #xA000 below #xA0FF by #x01 collect n)))'
MY_SEQUENCE=$( *command* )