在 Bash 中,如何将十进制基数转换为另一种基数,尤其是十六进制。走另一条路似乎很容易:
$ echo $((16#55))
85
Run Code Online (Sandbox Code Playgroud)
通过网络搜索,我找到了一个可以进行数学运算和字符操作来进行转换的脚本,我可以将其用作函数,但我原以为 bash 已经具有内置的基本转换了——可以?
# dd if=2013-Aug-uptime.csv bs=1 count=1 skip=3 2> /dev/null
d
# dd if=2013-Aug-uptime.csv bs=1 count=1 skip=0x3 2> /dev/null
f
Run Code Online (Sandbox Code Playgroud)
为什么第二个命令输出不同的值?
是否可以将 skip|seek 偏移量dd作为十六进制值传递?
我想知道是否有一种方法可以使用 bash 扩展来查看十六进制数的所有组合可能性。我可以在二进制文件中扩展
在基数 2 中:
echo {0..1}{0..1}{0..1}
Run Code Online (Sandbox Code Playgroud)
哪个回馈:
000 001 010 011 100 101 110 111
Run Code Online (Sandbox Code Playgroud)
在基数 10 中:
echo {0..9}{0..9}
Run Code Online (Sandbox Code Playgroud)
哪个回馈:
00 01 02...99
Run Code Online (Sandbox Code Playgroud)
但在十六进制:
echo {0..F}
Run Code Online (Sandbox Code Playgroud)
重复一遍:
{0..F}
Run Code Online (Sandbox Code Playgroud) 是否有一个简单的命令来反转十六进制数?
例如,给定十六进制数:
030201
Run Code Online (Sandbox Code Playgroud)
输出应该是:
010203
Run Code Online (Sandbox Code Playgroud)
使用该rev命令,我得到以下信息:
102030
Run Code Online (Sandbox Code Playgroud)
更新
$ bash --version | head -n1
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
$ xxd -version
xxd V1.10 27oct98 by Juergen Weigert
$ rev --version
rev from util-linux 2.20.1
Run Code Online (Sandbox Code Playgroud) 简短版本(TL;DR)
\n我有 2 个小的单行文件,看起来相同:
\n$ cat f1 f2\n./cconv.sh 100 EUR\xc2\xa0USD\n./cconv.sh 100 EUR USD\nRun Code Online (Sandbox Code Playgroud)\n但它们不是,大小有 1 个字节的差异:
\n$ ls -l f1 f2\n(...) 24 oct. 30 16:19 f1\n(...) 23 oct. 30 16:19 f2\n\n$ diff f1 f2\n1c1\n< ./cconv.sh 100 EUR\xc2\xa0USD\n---\n> ./cconv.sh 100 EUR USD\nRun Code Online (Sandbox Code Playgroud)\n我曾经dhex计算过十六进制的差异。看起来 :
f1结束于c2 a0 55 53 44 0af2结束于 20 55 53 44 0a有人知道这里发生了什么事吗?有什么区别,更重要的是,它来自哪里?以下是包含这两个文件的 zip 文件的链接以及结果的屏幕截图dhex。
假设我有一个多行字符串,但上面的条目很短;如果我尝试 hexdump,那么我会得到这样的信息:
echo "something
is
being
written
here" | hexdump -C
#00000000 73 6f 6d 65 74 68 69 6e 67 0a 69 73 0a 62 65 69 |something.is.bei|
#00000010 6e 67 0a 77 72 69 74 74 65 6e 0a 68 65 72 65 0a |ng.written.here.|
#00000020
Run Code Online (Sandbox Code Playgroud)
大多数十六进制转储程序,包括hexdump简单地用作 2D 矩阵(您可以定义每行将有多少字节/列);所以在这种情况下,整个输出被压缩在两行转储上。
有没有我可以使用的程序,它会像往常一样继续运行 - 除非遇到新行(0x0a- 但可能是任何其他字符,或其序列),它也会开始一个新行?在这种情况下,我想像这样的输出:
00000000 73 6f 6d 65 74 68 69 6e 67 0a |something.|
0000000a 69 73 0a |is.|
0000000d 62 65 69 …Run Code Online (Sandbox Code Playgroud) 我有 bash 线:
expr substr $SUPERBLOCK 64 8
Run Code Online (Sandbox Code Playgroud)
这是返回给我的字符串行:
00080000
Run Code Online (Sandbox Code Playgroud)
我知道这实际上是小端的 0x00080000。有没有办法在像 0x80000 这样的 big-endian 中的 bash 中从它创建整数变量?
我正在处理一个嵌入式系统,它有一些可以通过文件描述符访问的内存(我不知道我在说什么,所以如果我错了,请纠正我)。
该内存为 32 kB,我想用 0x00 到 0xFFFFFFFF 填充它。我知道文本文件是这样的:
exec {fh} >> ./eeprom;
for i in {0..32767}; do echo $i >& $fh; done; $fh>&-;
Run Code Online (Sandbox Code Playgroud)
这将写入 ASCII 字符 0 到 977。
如果我这样做,hexdump eeprop | head我会得到:
0000000 0a30 0a31 0a32 0a33 0a34 0a35 0a36 0a37
0000010 0a38 0a39 3031 310a 0a31 3231 310a 0a33
0000020 3431 310a 0a35 3631 310a 0a37 3831 310a
0000030 0a39 3032 320a 0a31 3232 320a 0a33 3432
0000040 320a 0a35 3632 320a 0a37 3832 320a 0a39 …Run Code Online (Sandbox Code Playgroud) 这是文件的开头:
# hexdump -n 550 myFile
0000000 f0f2 f5f0 f7f9 f1f1 f1f0 f0f0 e3f1 f3c8
0000010 f3f5 0000 0000 000c 0000 0000 0000 000c
0000020 0000 0c00 0000 0000 0000 0c00 0000 0000
0000030 000c 0000 0000 0000 000c 0000 0c00 0000
0000040 0000 0000 0c00 0000 0000 000c 0000 0000
0000050 0000 000c 0000 0c00 0000 0000 0000 0c00
0000060 0000 0000 000c 0000 0000 0000 000c 0000
*
00000b0 0000 0000 000c 0000 0000 0000 0000 0000
00000c0 …Run Code Online (Sandbox Code Playgroud) hex ×10
bash ×4
numeric-data ×3
shell ×2
arguments ×1
calculator ×1
command-line ×1
dd ×1
devices ×1
diff ×1
echo ×1
expr ×1
grep ×1
hexdump ×1
linux ×1
shell-script ×1