我有一个相当长的十六进制字符串Buffer.到String("hex"),我想将其打印到一个日志(log)文件,每个字节包含32个二元组.

所以基本上从 e01102020809020300800202020809020208095f520c8066054445472b44739621e0d003040401d21044454946583532463447444a4d010000d3104445472b445333374f53474b32010000d4104445472b44533337474b563033010000d503040401d6104445472b444342324354473031010000d7104445472b44504450535f5f5f5f0106009000

e0 11 02 02 08 09 02 03 00 80 02 02 02 08 09 02 02 08 09 5f 52 0c 80 66 05 44 45 47 2b 44 73 96
21 e0 d0 03 04 04 01 d2 10 44 45 49 46 58 35 32 46 34 47 44 4a 4d 01 00 00 d3 10 44 45 47 2b 44
53 33 37 4f 53 47 4b 32 01 00 00 d4 10 44 45 47 2b 44 53 33 37 47 4b 56 30 33 01 00 00 d5 03 04
04 01 d6 10 44 45 47 2b 44 43 42 32 43 54 47 30 31 01 00 00 d7 10 44 45 47 2b 44 50 44 50 53 5f
5f 5f 5f 01 06 00 90 00

I have tried hex.replace(/.{64}/g, "$1\n") 到 wrap the hex string after 32 tuplets but don't know how 到 add the spaces between the tuplets now. I would prefer 到 do that in one regex, if possible?

推荐答案

在JavaScript中,您无法在一个regex中真正做到这一点,因为它不支持变长向后看(一般)、conditional replacement\G meta sequence等功能.您只需将字符串拆分为最多64个字符的块,然后将这些字符串拆分为最多2个字符的块,并使用空白和白线连接拆分:

const hex = 'e01102020809020300800202020809020208095f520c8066054445472b44739621e0d003040401d21044454946583532463447444a4d010000d3104445472b445333374f53474b32010000d4104445472b44533337474b563033010000d503040401d6104445472b444342324354473031010000d7104445472b44504450535f5f5f5f0106009000'

const out = hex
    .match(/(.{1,64})/g)
    .map(s => s.match(/.{1,2}/g).join(' '))
    .join('\n')

console.log(out)

注意,我在第二个regex中使用了{1,2},以防您的数据可能具有奇数个字符.如果不会,您可以简单地使用.{2}(或简化为..).

您还可以定义一个简化器函数,使用一个regex将字符串拆分为可变行长度:

const replacer = n => {
  let cnt = 0
  return (m) => m + ((++cnt % n) ? ' ' : '\n')
}

const hex = 'e01102020809020300800202020809020208095f520c8066054445472b44739621e0d003040401d21044454946583532463447444a4d010000d3104445472b445333374f53474b32010000d4104445472b44533337474b563033010000d503040401d6104445472b444342324354473031010000d7104445472b44504450535f5f5f5f0106009000'

let out = hex.replace(/../g, replacer(32))

console.log(out)

out = hex.replace(/../g, replacer(16))

console.log(out)

out = hex.replace(/../g, replacer(8))

console.log(out)

出于兴趣,我在电脑上使用3000个字符的输入字符串对每个答案进行了1000次迭代.结果(以毫秒为单位)是:

algorithm result
Nick (match/join) 1208
blhsing 1300
Oussama BASRY 1362
Pointy 2092
Nick (replacer) 2142

因此,尽管更精简的函数提供了很大的灵活性,但由于所有的函数调用,它会带来性能成本.

Javascript相关问答推荐

如何使用JavaScript动态地将CSS应用于ToDo列表?

在JavaScript中,如何将请求的回调函数的结果合并到运行的代码中?

为什么JavaScript双边字符串文字插值不是二次的?

单击更新页面的按钮后,页面刷新;测试/断言超时,有两个标题,但没有一个标题

如何使用侧边滚动按钮具体滚动每4个格?

我们如何从一个行动中分派行动

查找最长的子序列-无法重置数组

为什么useState触发具有相同值的呈现

类构造函数不能在没有用With Router包装的情况下调用

映射类型定义,其中值对应于键

Use Location位置成员在HashRouter内为空

创建以键值对为有效负载的Redux Reducer时,基于键的类型检测

VSCode中出现随机行

为什么在运行于<;img>;事件处理程序中的JavaScript中x和y是不可变的?

我怎样才能点击一个元素,并获得一个与 puppeteer 师导航页面的URL?

对不同目录中的Angular material 表列进行排序

Django模板中未加载JavaScript函数

KeyboardEvent:检测到键具有打印的表示形式

每隔一行文本段落进行镜像(Boustrophedon)

相对于具有选定类的不同SVG组放置自定义工具提示