如何在Elixir中执行十六进制编码?为何JavaScript中Buffer.from会得到该结果?
我来帮你拆解这两个问题哈~
在Elixir中执行十六进制编码操作
在Elixir里做十六进制编码其实很简单,核心是借助Erlang标准库的:binary模块函数——毕竟Elixir的字符串本质就是二进制,直接用就行:
- 二进制/字符串转十六进制字符串:用
:binary.encode_hex/1,它会把输入的二进制数据转换成小写的十六进制字符串。
示例代码:# 普通字符串转十六进制 :binary.encode_hex("hello world") # 输出:"68656c6c6f20776f726c64" # 二进制数据转十六进制 :binary.encode_hex(<<1, 2, 3>>) # 输出:"010203" - 生成大写的十六进制字符串:如果需要大写格式,给函数传第二个参数
:upper就行::binary.encode_hex("hello", :upper) # 输出:"68656C6C6F"
顺带提一句,要是你需要反向操作(把十六进制字符串转回二进制),用:binary.decode_hex/1就可以,这个场景也挺常见的。
关于JavaScript中Buffer.from的行为解释
你遇到的这个情况,核心是Buffer.from的默认编码规则:
当你直接传字符串给Buffer.from()却不指定编码时,它默认会用utf-8编码把字符串转换成字节数组。你传入的是一个128字符长的十六进制字符串,每个字符(比如"3"、"2"、"0")都是ASCII范围内的字符,每个ASCII字符在UTF-8编码下占1个字节,所以128个字符就对应128个字节,也就是长度为128的Uint8Array,每个元素就是对应字符的ASCII码值(比如"3"的ASCII码是51,"2"是50,所以开头就是[51, 50, ...])。
如果你的需求是把这个十六进制字符串解析成对应的二进制数据(而不是把字符串本身转成字节),那得给Buffer.from()指定第二个参数'hex',这样它会每两个十六进制字符解析成一个字节:
const hexStr = "32038ca6aa25db9377aaf54ac2de4059419205e4b9021b68a3b83039a5742b1f0d55cd39c3b8369373507963209c9676ac230d4724cb343b26a3cba4d6c84cae"; const buffer = Buffer.from(hexStr, 'hex'); console.log(buffer.length); // 输出64,因为128个十六进制字符 → 64个字节
内容的提问来源于stack exchange,提问作者Kamil Lelonek
相关产品推荐
相关产品推荐

