如何在Vim中将十进制数转换为十六进制数?

nszi6y05  于 2023-11-19  发布在  其他
关注(0)|答案(6)|浏览(278)

我在Vim中编辑的一个文件中有这个列:

  1. 16128
  2. 16132
  3. 16136
  4. 16140
  5. # etc...

字符串
我想把它转换成这个列:

  1. 0x3f00
  2. 0x3f04
  3. 0x3f08
  4. 0x3f0c
  5. # etc...


我如何在Vim中做到这一点?

nmpmafwu

nmpmafwu1#

使用printf(类似于C的sprintf)和\=命令来处理替换:

  1. :%s/\d\+/\=printf("0x%04x", submatch(0))

字符串

详情

  • :%s/\d\+/:匹配任意行(:%)上的一个或多个数字(\d\+)并替换(s)。
  • \=:对于每个匹配项,替换为以下表达式的结果:
  • printf("0x%04x",:使用格式"0x%04x"生成一个字符串,它对应于文字0x,后跟一个四位(或更多)十六进制数字,用零填充。
  • submatch(0):完全匹配的结果(即数字)。

有关详细信息,请参阅:

  1. :help printf()
  2. :help submatch()
  3. :help sub-replace-special
  4. :help :s

展开查看全部
0dxa2lsx

0dxa2lsx2#

另一种方式:

  1. :rubydo $_ = '0x%x' % $_

字符串
或者:

  1. :perldo $_ = sprintf '0x%x', $_


这是一个更少的输入,你避免了一个水平的引号/ shell转义,你会得到,如果你这样做,通过:!。你需要Perl / Ruby支持编译到您的Vim。

de90aj5v

de90aj5v3#

另一种方法,将其传递给awk

  1. awk '{printf "0x%x\n",$1}' file

字符串

qybjjes1

qybjjes14#

选择(视觉)包含数字的行块,然后:

  1. :!perl -ne 'printf "0x\%x\n", $_'

字符串

vltsax25

vltsax255#

要将十进制转换为十六进制,请使用以下命令

  1. :echo printf("%x", decimal)

字符串
这将导致显示十进制的十六进制等效值。
范例:

  1. :echo printf("%x", 61444)


显示f004(相当于61444)。
这不会在文件中找到并替换61444。

rks48beu

rks48beu6#

您可以轻松地创建一个持久的Vim宏来实现此目的:

  1. let @x='"yy:r! printf "= 0x\%x" $((^Ry))^MkJ$'

字符串
应该注意的是,^R^M是必须与C-q C-rC-q RET一起输入的特殊字符。当您将其添加到.vimrc时,它定义了一个要与@x一起运行的宏。
宏将当前选择复制到寄存器中,运行printf shell命令将数字转换为十六进制,并将结果插入同一行。使用$(( ... ))的好处是它利用了bash内置的算术计算功能,因此您可以选择0xdead + 0x1337并获得:
0xdead + 0x1337 = 0xf1e4
要在完整的列上运行它,您可以创建一个宏,选择点处的数字,例如,使用viW并运行@x。然后,您可以选择所有行并使用norm @a在每行上运行宏,假设您的宏被保存为注册a。

相关问题