我需要将文本文件中的十进制值列表转换为十六进制格式,例如 test.txt 可能包含:
131072
196608
262144
327680
393216
...
输出应该是十六进制值列表(十六进制 8 位,带前导零):
00020000
00030000
00040000
...
输出被打印到文本文件中。如何用 python 或 linux shell 脚本来做这个?
编辑#1
我错过了一个额外的操作:我需要80000000
为每个创建的十六进制值添加十六进制。(算术加法,适用于已创建的十六进制值列表)。
您可以使用
printf
and执行此操作bash
:或者使用 printf 和 bc...只是...因为?
为了将输出打印到文本文件,只需使用 shell 重定向
>
,如:三种可能的解决方案(假设每一行都是一组唯一的数字):
对于像 ksh、bash、zsh 这样的 shell:
仅适用于 bash
对于更简单的 shell:dash(基于 Debian 的系统中的默认 sh)、ash(busybox 模拟 shell)、yash 以及 AIX 和 Solaris 中的一些默认 shell:
事实上,对于像 heirloom 版本(Bourne like)这样的 shell,它需要写成这样(它可以在上面列出的所有 posix shell 上工作,但我强烈建议不要使用它):
回答编辑#1
了解十六进制值
80000000
会导致 32 位计算机上的溢出(现在不常见,但可能)。检查echo "$((0x80000000))"
不打印负值。使用
awk
:又一个单行。仍然不是 python,但它允许注释、空行和文件中的任何内容,并且只打印仅包含数字的行的结果。
给定这样的文件:
它打印
以下是 PHP 中的几个单行解决方案:
使用朱莉娅
阅读多行应该更容易:
hex( value, pad)
将值转换为十六进制,并根据需要添加填充。hexadd
需要整数作为输入,因此我们将字符串(的输出eachline
)转换为Int
withparse(Int,"string")
并在我们的函数中使用它。julia -e
计算一个表达式。使用直流:
解释:
dc -f test.txt -e '16o 16i [80000000 + p sa z 1 <r] sr z 1 <r 80000000 + p' > output.txt
-f file
将文件内容压入堆栈-e
执行表达式16o
将输出转换为 16 进制16i
假设输入以 16 为基数。这发生在读取文件之后,因此文件是以 10 为基数读取的。更明确地说,我可以做dc -e '10i' -f file -e '16 i 8000000'
[...]
将字符串压入堆栈。该字符串将用作宏。80000000 +
添加当前栈顶和十六进制 80000000。将结果推送到栈顶。p
打印当前栈顶,不弹出。仅打印换行符的打印选项。sa
弹出并将堆栈顶部存储在寄存器'a'中。它永远不会被使用,只是一种摆脱麻袋顶部的方法。z
当前堆栈顶部现在具有堆栈深度。需要结束递归调用。1
将 1 推到栈顶。与之前推送的堆栈深度 (z) 相比很有用。<r
比较堆栈中的 2 个值,如果第 2 个小于第 1 个,则执行寄存器 'r'。实际上比较堆栈深度和'1'。sr
弹出并存储在寄存器'r'中。现在宏在寄存器'r'中,只要堆栈深度大于1,它就会执行。除了还没有调用它。d
复制栈顶并推送。x
将栈顶作为宏执行。d sr x
复制宏并推送,现在堆栈有2个副本,弹出并存储顶部副本以注册,弹出并执行第二个副本...