【问题标题】:jInterface to create External Erlang TermjInterface 创建 External Erlang Term
【发布时间】:2013-02-17 19:49:48
【问题描述】:

如何格式化以下 erlang 术语:

{ atom, "message" }

在 jInterface 中转换为我可以在 erlang shell 中调用的外部格式

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

Erlang 接收到的二进制文件是:

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

然后在 erlang shell 中将接收到的术语转换为二进制给出一个 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>>)

【问题讨论】:

  • 对不起,我真的不明白你的问题和你在这里问什么..你能更准确吗?
  • 为什么我的 java jInterface 代码没有创建完整的 BERT 术语?
  • 为什么是二进制表示?您是在使用套接字还是使用连接到 erlang 的 java 节点?

标签: java erlang jinterface


【解决方案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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-09-21
      • 2020-03-15
      • 2017-12-04
      • 2016-04-23
      • 2015-09-20
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      相关资源
      最近更新 更多