如何在 javascript 中将混合八进制转换为人类可读的 IPv6?

How do I convert a hybrid octal to human readable IPv6 in javascript?

在我们的数据库中,IP地址是以Binary(16)形式存储的,是一个ipv6 在客户端,我将其作为字符串获取,它是八进制代码和可打印 ASCII 字符的混合体。可打印 ASCII 字符范围(范围 [0x20, 0x7e])中的一个字节由相应的 ASCII 字符表示,但反斜杠 ('\') 除外,它被转义为 '\'。所有其他字节值均由其相应的八进制值表示。例如,字节 {97,92,98,99},在 ASCII 中是 {a,\,b,c},被翻译成文本 'a\bc'.

" [=25=]150[=25=]0[=25=]0[=25=]0[=25=]0[=25=]000[=25=]04Az[=25=]0"

问题是我想将其显示为人类可读的 IPv6。我尝试了一些库,但它们需要字节数组作为输入。

我想我可以通过将混合八进制转换为字节数组然后使用 https://www.npmjs.com/package/ipaddr.js 转换为 IPv6 来解决我的问题。

上面的字符串转换为十进制值的字节数组为: [32, 1, 13, 184, 0, 0, 0, 0, 0, 8, 8, 0, 12, 65, 122, 0] 空白 space 是 32 ascii,A=65 和 z=122

我正在使用一个函数将混合八进制解析为字节数组。准备好后我会分享。

检查 IPv6 是否首先从 Binary(16) 解码,看起来它存储了 inet6_pton() 函数但 return 没有解码它。

解析器解决方案可以是

const input = " \001\015\270\000\000\000\000\000\010\010\000\014Az\000";
const output = Uint8Array.from(input.match(/\(\d\d\d)|\([ -~])|\(\)|([ -~])/g), x =>
    x.length == 1 ? x.charCodeAt(0) : x.length == 2 ? 92 : parseInt(x.slice(1), 8)
);
console.log(output); // Uint8Array(16) [32,1,13,184,0,0,0,0,0,8,8,0,12,65,122,0]

但我真的建议使用不同的(更容易解析的)格式,例如十六进制字符串、base64 编码的字符串或只是一个数字数组。