Erlang中使用#符号从二进制转回十进制时出错的技术问询
解决Erlang中二进制转十进制的
#语法错误问题 我来帮你理清这个问题——你遇到的核心点是Erlang里B#N语法的使用场景限制,咱们一步步拆解:
问题根源:B#N是编译期字面量,不是运行时函数
Erlang中的B#N语法(比如16#F、2#1111)是编译阶段就会解析的字面量,只能在写代码时直接写死基数和数字,没办法在运行时动态拼接使用。
你之前的操作:
list_to_integer(integer_to_list(15,2))
得到的是十进制整数1111(因为把字符串"1111"当成十进制数字转成了整数),这时候你想用2#1111语法去转它,本质是试图把十进制的1111当成二进制字面量处理,这显然不符合语法规则,自然会报错。
正确的运行时转换方法:使用list_to_integer/2
Erlang标准库提供了list_to_integer/2函数,专门用来将指定基数的字符串转换为十进制整数,完全适配运行时的动态转换需求:
示例代码
% 直接把二进制字符串转十进制 list_to_integer("1111", 2). % 返回15,这正是你想要的结果 % 结合integer_to_list的完整流程 BinaryStr = integer_to_list(15, 2), % 得到"1111" DecimalNum = list_to_integer(BinaryStr, 2), % 得到15 DecimalNum + 1. % 返回16,符合预期
验证类型
这个方法得到的结果完全符合整数校验:
is_integer(DecimalNum). % 返回true is_number(DecimalNum). % 返回true
额外提醒
不要把integer_to_list(N, B)得到的字符串转成十进制整数再处理,那样会丢失基数信息,把二进制的"1111"变成十进制的1111,这不是二进制转十进制的正确逻辑。
内容的提问来源于stack exchange,提问作者ahron
相关产品推荐
相关产品推荐

