我需要一种简单的方法来生成一个.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 :(得分: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'
印刷品不酷吗?
答案 1 :(得分:2)
这是在KSH上测试的OpenBSD实现(应该适用于任何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
示例输出:
$ ./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;
关于输出到文本文件,只需使用shell重定向操作符:
$./hex-range.sh 91 FF > output.txt
答案 2 :(得分:2)
另一个尝试(仍需要seq但不是bc) - 适用于cygwin和linux:
seq 0 255 | while read n; do printf "%04X;" $n; done
输入为十进制,但输出为大写十六进制,您可以通过更新&#34; 04&#34;来更改要显示的数字。 printf格式字符串的一部分
答案 3 :(得分:0)
我几乎已经选择了一些简单的命令并将一个非常简单的脚本拼凑在一起,正确填充并创建我需要的输出:
#!/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
答案 4 :(得分:0)
迟到的回复,但我们走了。我只是想创建一个包含从0到255的字节序列的文件。这是我得到的:
Dim Property As String
Dim Accnt As String
Property = Worksheets("Audit").Range("L6").Value
Property = StrConv(Property, vbProperCase)
Accnt = Worksheets("Audit").Range("L7").Value
ActiveWorkbook.saveas "D:\(username)\Documents\" & Accnt & " - " & Property & ".xlsx", FileFormat:= _
xlOpenXMLWorkbook, CreateBackup:=False
现在它正是被问到的,但是人们可以很容易地弄清楚如何更改命令来做到这一点。
希望它有所帮助。
答案 5 :(得分:0)
我只想使用简单的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
答案 6 :(得分:0)
这是另一种实现,它没有考虑所有原始约束(即零填充和分号分隔符),但是对于某些人可能仍然有用:
bc <<< "obase=16; ibase=16; for (i = $low; i <= $high ; i++) i"
它通过使用here字符串避免了单独的派生(尽管将字符串更方便地移植到bc
的版本也不太糟糕),然后让bc
进行所有计算和转换。您可以删除ibase=16
以允许使用十进制输入(也可以将obase
设置为其他具有八进制或二进制或任何其他形式的数字。)
理想情况下,我认为这将全部内置到seq
中,尽管GNU版本的文档建议他们希望您自己做:
如果要输出十六进制整数,则可以使用printf进行转换:
$ printf '%x\n' $(seq 1048575 1024 1050623)
fffff
1003ff
1007ff
答案 7 :(得分:0)
只想指出,尽管我们热爱我们的根源,但有时却不值得付出痛苦。考虑到涉及输入十六进制的问题,所有示例都是我所知道的使用每种语言处理十六进制的最简单方法,但是我的知识非常有限,因此,如果您能想到更好的方法,请发表评论。
要点是:使用stff,尤其是较常见的语言,因为它们可能已经作为依赖安装在很多地方……从来没有发现没有Ruby和/或Python的计算机,现在有了Electron,几乎每个人也都拥有NodeJS ...
我使用了单行代码,并包含语法以直接从终端输入内容,我将这些内容保存到备忘单上,并在需要使用时复制粘贴或键入
Ruby:
x
我非常了解我的Ruby,所以这就是我要用的东西,为什么它是如此的漂亮。对于不习惯的人,最后的ruby -e "puts (0xA000..0xA0FF).to_a.join ';'"
用作连接的参数(而';'
将整个东西当作参数)。邓诺(Dunno)为什么仍然有人不使用Ruby ...
Python(不是我的事,我懒得在不减少约数的情况下处理列表项,至少我希望这只是我的懒惰):
puts
再一次,我真的希望这只是因为我是一个Rubyist而太糟糕了,因为我仍然希望有一天Python不再让我失望...
JavaScript(好吧,我承认这太糟糕了):
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(';'))"
的方法,但这不是很有用,而且更容易引起混淆...
Lisp:
f
除了LISP的sbcl --noinform --quit --eval '(print (format nil "~{~A~^;~}" (loop for n from #xA000 below #xA0FF by #x01 collect n)))'
狗屎以外,不是最漂亮或最简洁的东西,但可读性很强...我只是在这里停留,希望Clojure,Scheme,Chicken或其他任何具有更好处理方式的东西... < / p>
现在Ruby是我的主要工作,我想这个事实以及我喜欢它的原因在这个示例中非常明显:在Ruby中,您以一种非常简洁和可读的方式来做最好的事情,没有必要进行转换,导入内容,声明变量等。它流动得很漂亮。 <3
由于LISP相当低级,您可以对其进行编译,包含宏,方言等,这还可以,特别是如果人们的设置和/或方言使事情变得井井有条,则多数情况下感觉真的很糟糕的格式(虽然Loop仍然太冗长,恕我直言,但是方言,宏等再次可以解决这个问题)。
我不想再说Python了,我真的希望我是这里缺乏知识的人,因为必须在影响外部变量的循环与导入内容之间进行选择,以及使用Lambda进行他妈的串联,这是您只需要做的事情关于C,LISP和一般的低级内容...
JavaScript,好吧,JavaScript很烂,我们都知道,而且无论如何我们都喜欢它,所以我想这是一个很好的例子,说明JS多么可爱……
我可能应该包括Perl版本,因为它是事实上的Linux语言,但是即使我在Python,LISP和Javascript方面不那么出色,我也绝对不是Perl,所以我将其保留别人。
答案 8 :(得分:0)
正如@FernandoCoreiro 在他的回答中指出的那样,它不是经常比另一种更进化的语言,不会被安装,所以不是使用 shell,你可以使用例如 python
或 php 来生成它,并将其设置在一个 shell 变量中:
MY_SEQUENCE=$( *command* )
command 是以下之一:
在Python
python -c 'print(";".join("%04X"%i for i in range(0xA000, 0xA0FF + 1)))'
range(0xA000, 0xA0FF + 1)
生成从 40960 (0xA000) 到 41215 (0xA0FF) 的序列,
注意,您可以以十进制或十六进制格式输入边界。写入 0xFF 或 255 是等效的。
注意该范围不包括上限,因此 + 1
"%04X"%i
将序列的每个数字格式化为至少 4 位的十六进制字符串(X 表示大写,x 表示小写),
";".join()
连接所有这些字符串,用“;”将它们连接起来,
printf
将结果写入标准输出。
在PHP
php -r 'echo implode(";", array_map(function($n) { return sprintf("%04X", $n); }, range(0xA000, 0xA0FF)));'
range(0xA000, 0xA0FF)
生成从 40960 (0xA000) 到 41215 (0xA0FF) 的序列,
注意,您可以以十进制或十六进制格式输入边界。写入 0xFF 或 255 是等效的。
array_map()
对序列的每个数字应用给定的函数,
function($n) { return sprintf("%04X", $n) }
将数字格式化为至少 4 位的十六进制字符串(X 表示大写,x 表示小写),
implode(';', )
连接所有这些字符串,用“;”将它们连接起来,
echo
将结果写入标准输出。