我需要一种简单的方法来生成一个.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 .....;
有什么建议?我不是程序员,所以最好,最简单的方法就是超越我.
mca*_*cau 10
另一种尝试(仍然需要 seq 但不需要 bc) - 适用于 cygwin 和 linux:
seq 0 255 | while read n; do printf "%04X;" $n; done
Run Code Online (Sandbox Code Playgroud)
输入是十进制,但输出是大写的十六进制,您可以通过更新 printf 格式字符串的“04”部分来更改要显示的数字
这是一个可移植的脚本(任何POSIX shell都可以),应该非常快速地工作(没有分叉到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'
Run Code Online (Sandbox Code Playgroud)
印刷品不酷吗?
小智 7
我只是喜欢使用简单的 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
Run Code Online (Sandbox Code Playgroud)
输出应如下所示:
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;
Run Code Online (Sandbox Code Playgroud)
这是一句单行话,但让我给它一些结构:
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
Run Code Online (Sandbox Code Playgroud)
这是在 OpenBSD 上的 KSH 中测试的实现(应该与任何 Bourne shell 一起使用,不依赖于bash
功能)。
#!/bin/sh
START=$1
END=$2
function h2d {
echo "ibase=16; $@"|bc
}
function d2h {
echo "obase=16; $@"|bc
}
# convert to decimal
START_DEC=`h2d ${START}`
END_DEC=`h2d ${END}`
# find length of last hex number
LENGTH=`expr ${#END} - 1`
for i in `nawk "BEGIN{ for(i=${START_DEC};i<=${END_DEC};i++) print i}"`
do
# convert output to hex
OUTPUT=`d2h ${i}`
# calculate output length
OUTPUT_LENGTH=`expr ${#OUTPUT}`
# calculate required padding
PAD_LENGTH=`expr ${LENGTH} - ${OUTPUT_LENGTH}`
# output padding
for j in `nawk "BEGIN{ for(j=0;j<=${PAD_LENGTH};j++) print j}"`
do
echo -n 0
done
# output number
echo -n ${OUTPUT}\;
done
# for the newline
echo
Run Code Online (Sandbox Code Playgroud)
示例输出:
$ ./hex-range.sh 91 FF
91;92;93;94;95;96;97;98;99;9A;9B;9C;9D;9E;9F;A0;A1;A2;A3;A4;A5;A6;A7;A8;A9;AA;AB;AC;AD;AE;AF;B0;B1;B2;B3;B4;B5;B6;B7;B8;B9;BA;BB;BC;BD;BE;BF;C0;C1;C2;C3;C4;C5;C6;C7;C8;C9;CA;CB;CC;CD;CE;CF;D0;D1;D2;D3;D4;D5;D6;D7;D8;D9;DA;DB;DC;DD;DE;DF;E0;E1;E2;E3;E4;E5;E6;E7;E8;E9;EA;EB;EC;ED;EE;EF;F0;F1;F2;F3;F4;F5;F6;F7;F8;F9;FA;FB;FC;FD;FE;FF;
Run Code Online (Sandbox Code Playgroud)
关于输出到文本文件,只需使用 shell 重定向运算符:
$./hex-range.sh 91 FF > output.txt
Run Code Online (Sandbox Code Playgroud)