You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:25:38