生成特定范围的十六进制数

Dav*_*ave 7 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;

如果我输入FFF1200输出这些值...等:

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”部分来更改要显示的数字


Jen*_*ens 9

这是一个可移植的脚本(任何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)

印刷品不酷吗?

  • 目前,在ksh93(它识别`var = $(printf ...)`并优化它以避免分叉)比bash(它没有)更快执行; 但是这并不容易修复而不降低可移植性(例如使用仅限bash的语法,例如来自'%d'的'printf -v'"0x $来自"`).尽管如此,它仍然是一个出色的答案(而那些孤独的叉子,当它们确实发生时,它们在一个循环之外,使它们相对无关紧要) - 并且希望bash能够像ksh93一样有效地执行它. (2认同)

小智 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)


chu*_*ckx 2

这是在 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)

  • 不太 bournish:古代 sh 不知道“function”保留字。使用 `h2d () { ...; }` 代替。 (2认同)