【发布时间】:2026-02-11 23:30:04
【问题描述】:
我在 erlang 中将十六进制字符串转换为 ascii 字符串时遇到问题。
例子:
我的字符串:45474D31303930303031
解析的期望值:EGM1090001
这样做的最佳方法是什么?
【问题讨论】:
我在 erlang 中将十六进制字符串转换为 ascii 字符串时遇到问题。
例子:
我的字符串:45474D31303930303031
解析的期望值:EGM1090001
这样做的最佳方法是什么?
【问题讨论】:
我宁愿为这种转换创建函数。种类:
hex2s(HStr) -> hex2s(HStr,[]).
hex2s([X1,X2|Rest], Acc) -> hex2s(Rest, [ hv(X1) * 16 + hv(X2) |Acc ]);
hex2s([], Acc) -> lists:reverse(Acc).
hv($0) -> 0;
hv($1) -> 1;
hv($2) -> 2;
hv($3) -> 3;
hv($4) -> 4;
hv($5) -> 5;
hv($6) -> 6;
hv($7) -> 7;
hv($8) -> 8;
hv($9) -> 9;
hv($A) -> 10;
hv($B) -> 11;
hv($C) -> 12;
hv($D) -> 13;
hv($E) -> 14;
hv($F) -> 15.
测试:
hex2s("45474D31303930303031").
“EGM1090001”
【讨论】:
io_lib 太重了。但是这里发布的解决方案也不需要所有 hv/1 子句。相反,第一个hex2s/2 子句可以只调用list_to_integer([X1,X2], 16) 来代替对hv/1 和相关算术的调用。它同样快,而且代码更少。