2013-03-03 25 views
0

我如何可以格式化以下Erlang项:jInterface创建外部Erlang项

{ atom, "message" } 

在jInterface到我可以在Erlang的外壳调用外部格式

erlang:binary_to_term(Binary) 

例子: 请注意,因为元组将通过网络发送,我通过转换为byte []完成。

OtpErlangObject[] msg = new OtpErlangObject[2]; 
msg[0] = new OtpErlangAtom("atom"); 
msg[1] = new OtpErlangString("message"); 

OtpErlangTuple reply = new OtpErlangTuple(msg); 

OtpOutputStream stream = new OtpOutputStream(reply); 

stream.toByteArray() // byte[] which I send over net 

由二郎接收二进制是:

B = <<104,2,100,0,4,97,116,111,109,107,0,7,109,101,115,115,97,103,101>> 

然后,在一个Erlang壳接收到的术语转换为二进制给出badarg。

binary_to_term(B).              
** exception error: bad argument 
    in function binary_to_term/1 
     called as binary_to_term(<<104,2,107,0,4,97,116,111,109,107,0,7,109, 
            101,115,115,97,103,101>>) 
+0

抱歉,但我真的不明白你的问题,你在这里问什么..你能更精确? – user601836 2013-03-04 14:02:26

+0

为什么我的java jInterface代码不能创建完整的BERT术语? – BAR 2013-03-04 23:29:49

+0

为什么二进制表示?你使用套接字还是使用连接到erlang的java节点? – user601836 2013-03-07 08:59:20

回答

1
binary_to_term(<<131,104,2,107,0,4,97,116,111,109,107,0,7,109,101,115,115,97,103,101>>). 
{"atom","message"} 

看来这个消息是缺少由term_to_binary所需的131标签。从Java输出中可以明显看出,这个标记没有被jinterface编码添加。如果我只是将131添加到二进制文件的开头,它会正确解码。

现在为什么Java不添加它?

我还是会接受的答案,因为我还没有正式回答我的问题

参考(以支持的方式,即不与131黑客):

http://www.erlang.org/doc/apps/erts/erl_ext_dist.html

0

我没有测试过这,但如果你编码为{atom, "message"},你不应该发送一个元组,而不是一个接一个地发送一个元组吗?尝试创建Tuple对象并将​​和message作为元素添加。