Vim 计算包含十六进制值的文件中第1位的数目

Vim 计算包含十六进制值的文件中第1位的数目,vim,Vim,有没有一种快速的方法来计算十六进制文件中的个数? 该文件类似于以下内容,表示十六进制值的序列: 13 ff a0 在这种情况下,1的数量是3+8+2=13个1的数量(在我们转换成二进制之后)。 现在我有数千行这样的代码,在vi命令中有没有一种快速的方法可以做到这一点?(假设文件是ascii十六进制的,如果不使用python编写一些东西应该不会那么困难) 只要稍加设置,你就能很快做到这一点 首先创建一个包含以下内容的文件 let g:hex2popcount = { \

有没有一种快速的方法来计算十六进制文件中的个数? 该文件类似于以下内容,表示十六进制值的序列:

13
ff
a0
在这种情况下,1的数量是3+8+2=13个1的数量(在我们转换成二进制之后)。 现在我有数千行这样的代码,在vi命令中有没有一种快速的方法可以做到这一点?

(假设文件是ascii十六进制的,如果不使用python编写一些东西应该不会那么困难)

只要稍加设置,你就能很快做到这一点

首先创建一个包含以下内容的文件

let g:hex2popcount = {
            \ '0': 0, '1': 1, '2': 1, '3': 2,
            \ '4': 1, '5': 2, '6': 2, '7': 3,
            \ '8': 1, '9': 2, 'a': 2, 'b': 3,
            \ 'c': 2, 'd': 3, 'e': 3, 'f': 4}

function! Accum(var)
    let g:x += g:hex2popcount[a:var]
endfunction
HEX2OPCOUNT dict是一种将16个十六进制字符映射到一个一位数的计数器的命令。然后我们创建一个名为Accum的函数,用于跟踪我们看到的比特数。要在文件中的所有十六进制数字上运行此操作,我们将使用表达式和
n
标志进行替换,该标志实际上不进行任何替换

let g:x = 0 | %s/\x/\=Accum(submatch(0))/gn | echo g:x
我们将
g:x
设置为零,然后对文件中的每个十六进制数字运行
acum(子匹配(0))
。替换完成后,
g:x
包含一位数的总数

确保在vim中找到该文件的源代码。使用
vim-S
:source
或将命令放在vimrc中即可

相关的帮助页面包括
:帮助子替换表达式
:帮助:s_标志