【问题标题】:Erlang hex string to ascii stringErlang 十六进制字符串到 ascii 字符串
【发布时间】:2026-02-11 23:30:04
【问题描述】:

我在 erlang 中将十六进制字符串转换为 ascii 字符串时遇到问题。

例子:

我的字符串:45474D31303930303031

解析的期望值:EGM1090001

这样做的最佳方法是什么?

【问题讨论】:

    标签: erlang hex ascii


    【解决方案1】:

    我宁愿为这种转换创建函数。种类:

    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”

    【讨论】:

    • 嗨,我找到了一个将十六进制转换为字符的默认命令 '{ok, [NewChar], _} = io_lib:fread("~16u", [X1]++[X2])'希望对未来有所帮助!
    • 是的,我知道 io_lib:fread,但在我看来它太重了,无法用于此任务..
    • 我同意io_lib 太重了。但是这里发布的解决方案也不需要所有 hv/1 子句。相反,第一个hex2s/2 子句可以只调用list_to_integer([X1,X2], 16) 来代替对hv/1 和相关算术的调用。它同样快,而且代码更少。