Erlang:将TCP发送字符串转换为其正确形式,例如<<&引用;SomeString"&燃气轮机&燃气轮机;至;SomeString";?

Erlang:将TCP发送字符串转换为其正确形式,例如<<&引用;SomeString"&燃气轮机&燃气轮机;至;SomeString";?,string,tcp,formatting,erlang,client-server,String,Tcp,Formatting,Erlang,Client Server,我有一个客户端和一个服务器,我使用客户端发送一个字符串,比如“Hello”,它在服务器端显示为。有没有办法简单地将转换回“Hello”?我试着用 String = io_lib:format("~p",[StringIn]), lists:flatten(String), 但这使得格式变成了[[60,60,\'Hello\',62,62]] 顺便说一下,这是代码: -module(ss1). -compile(export_all). -import(lists, [r

我有一个客户端和一个服务器,我使用客户端发送一个字符串,比如
“Hello”
,它在服务器端显示为
。有没有办法简单地将
转换回
“Hello”
?我试着用

String = io_lib:format("~p",[StringIn]),
            lists:flatten(String),
但这使得格式变成了
[[60,60,\'Hello\',62,62]]

顺便说一下,这是代码:

-module(ss1).
-compile(export_all).
-import(lists, [reverse/1]).

client() ->
    {ok, Socket} =  gen_tcp:connect("localhost", 2345,[binary, {packet, 4}]),
    ok = gen_tcp:send(Socket, "Hello"),
    receive
    {tcp,Socket,String} ->
        io:format("Client received = ~p~n",[String]),       
        io:format("Client result = ~p~n",[String]),
        gen_tcp:close(Socket)
    end.

server() ->
    {ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 4},  {reuseaddr, true}, {active, true}]),
    {ok, Socket} = gen_tcp:accept(Listen),
    gen_tcp:close(Listen),  
    loop(Socket).

loop(Socket) ->
    receive
    {tcp,Socket,String} ->      
        io:format("Server received String = ~p~n",[String]),            
        io:format("Server replying String = ~p~n",[String]),
        gen_tcp:send(Socket, String), 
        loop(Socket);
    {tcp_closed, Socket} ->
        io:format("Server socket closed~n")
    end.

您可以使用erlang模块中的函数-binary-to-list

  Eshell V5.9.1  (abort with ^G)

1> B = <<"Hello">>.
<<"Hello">>
2> erlang:binary_to_list(B).
"Hello"
3> 
Eshell V5.9.1(使用^G中止)
1> B=。
2> erlang:binary-to-list(B)。
“你好”
3> 

您可以使用erlang模块中的函数-binary-to-list

  Eshell V5.9.1  (abort with ^G)

1> B = <<"Hello">>.
<<"Hello">>
2> erlang:binary_to_list(B).
"Hello"
3> 
Eshell V5.9.1(使用^G中止)
1> B=。
2> erlang:binary-to-list(B)。
“你好”
3> 

原因是这一行:

{ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 4},  {reuseaddr, true}, {active, true}]),
具体地说,原子
二进制
在选项中传递。如果您传递的是
list
,则会得到一个常规字符串。有关
gen\u tcp:listen/2
,请参阅

以下代码不起作用的原因:

String = io_lib:format("~p",[StringIn]),
lists:flatten(String), ...
是不是
列表:展平/1
实际上不会改变
字符串
;它返回一个新列表,该列表是展开其参数的结果。这本可以奏效的:

lists:flatten(io_lib:format("~p", [StringIn])).

原因是这一行:

{ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 4},  {reuseaddr, true}, {active, true}]),
具体地说,原子
二进制
在选项中传递。如果您传递的是
list
,则会得到一个常规字符串。有关
gen\u tcp:listen/2
,请参阅

以下代码不起作用的原因:

String = io_lib:format("~p",[StringIn]),
lists:flatten(String), ...
是不是
列表:展平/1
实际上不会改变
字符串
;它返回一个新列表,该列表是展开其参数的结果。这本可以奏效的:

lists:flatten(io_lib:format("~p", [StringIn])).

如果只想使用
io:format
io\u lib:format
打印二进制文件,可以使用
~s
格式说明符:

1> MyBinary = <<"Hello">>.
<<"Hello">>
2> io:format("MyBinary is '~s'~n", [MyBinary]).
MyBinary is 'Hello'
ok
1>MyBinary=。
2> io:format(“MyBinary是'~s'~n',[MyBinary])。
我的二进制代码是“你好”
好啊

如果您只想使用
io:format
io\u lib:format
打印二进制文件,您可以使用
~s
格式说明符:

1> MyBinary = <<"Hello">>.
<<"Hello">>
2> io:format("MyBinary is '~s'~n", [MyBinary]).
MyBinary is 'Hello'
ok
1>MyBinary=。
2> io:format(“MyBinary是'~s'~n',[MyBinary])。
我的二进制代码是“你好”
好啊