这是啥类型的缓冲区?

Posted

技术标签:

【中文标题】这是啥类型的缓冲区?【英文标题】:what kind of a buffer is this?这是什么类型的缓冲区? 【发布时间】:2022-01-17 11:52:38 【问题描述】:

我正在使用一个奇怪的区块链,它的 API 返回如下数据:

0x36333562663261376537333436376636333363313931353738613938383137313663383633306235373164613034643634303334356331646232333231636537

现在,我知道这是我发送的字符串,实际上是 64 十六进制字符串 如上所述,我得到了 128 个字符(加上 0x)。

那么任何人都可以建议如何解码吗? 因为都是数字,我假设它是 base10,但是我们会有不同的字节长度(64 对 128)等等。

由于有很多 2s 和 3s,我猜这可能是 2 vs 3 字节的指标

它是某种类型的 unicode 数组吗? 前面的“0x”让我觉得它是十六进制值,但这里没有实际的DEADBEEF...

现在我知道我传入的原始字符串是 64 个十六进制字符。 我得到了 128 位小数。

我正在寻找 JS 中的转换器来取回十六进制“字符串”

我已经尝试过atob 和 Buffer 但还没有破解...

javascript - Converting between Unicode string and ArrayBuffer

【问题讨论】:

【参考方案1】:

如果您查看十六进制对(代表每个字节),您最初发送的十六进制字符串已被重新十六进制或重新编码为十六进制。例如,返回字符串的前 5 个字节如下所示:

3633356266 -> 36 33 35 62 66

这些都是有效的 ASCII 字符,解码为:

0x36 -> '6' 0x33 -> '3' 0x35 -> '5' 0x62 -> 'b' 0x66 -> 'f'

所以您可以看到,您的原始十六进制字符串(以 635bf 开头)再次被重新编码为十六进制并发送回您 - 本质上,它被视为字符串而不是十六进制值字符串(我相信是您打算将它们解释为的内容)。

要对其进行解码,您可以非常简单地将其拆分为 2 个字符的块并获取具有该值的 ASCII 代码点,然后将它们重新连接在一起(同时修剪开头的“0x”) :

const returnedStr = "0x36333562663261376537333436376636333363313931353738613938383137313663383633306235373164613034643634303334356331646232333231636537";

let hexBytes = returnedStr.slice(2).match(/.1,2/g);

let decodedStr = hexBytes.reduce((str, curr) => str + String.fromCharCode(parseInt(curr, 16)), "");

console.log(decodedStr);

【讨论】:

神圣的袋鼠杰克!你说得对!回想起来,很明显 3s 和 2s 是因为它是低个位数的十六进制,都是重新编码的,旧的双十六进制三明治!谢谢,疫情过后我欠你一杯啤酒!!! 我很困惑,因为它看起来不像十六进制,但它是重新十六进制的。这是什么巫术:D 很高兴我能帮上忙。非常奇怪的 API 服务,我建议为它找到一些实际的文档 :) 原来输入的数据已经被十六进制编码,所以我需要告诉它不要再次编码......

以上是关于这是啥类型的缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中buffer到底是啥意思?是数组?缓冲区?为啥一般C程序中都不定义他直接拿来用呢?

打开电脑网页会弹出“堆栈溢出”,这是啥问题,怎么解决?求大神解答,谢了!

Buffer是啥意思?

使用sprintf函数时应该注意啥问题

计算机中的“溢出”到底是啥意思

(STACK_OVERFLOW)是啥意思?