如何在Erlang之外创建一个表示DICT术语的字符串?

时间:2013-03-26 11:50:04

标签: erlang

我想在Java中构造一个表示 DICT 术语的字符串,该字符串将传递给Erlang进程,以反映为erlang术语(字符串到术语)。

我可以轻松地为ORDDICT实现这一点,因为它们被构造为元组列表中的简单排序键/值对,例如:[{field1,“value1”},{field2,“value2}] < / p>

但是,对于DICTS,它们被编译成一个特定的术语,我想找到如何对其进行逆向工程。我知道这个结构可以改变新版本,但是性能的好处和与Java集成的简易性将克服这一点。不幸的是,Erlang的JInterface基于简单的数据结构。有效的DICT类型将非常有用。

一个简单的dict定义如下:

D1 = dict:store("field1","AAA",dict:new()).
{dict,1,16,16,8,80,48,
  {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
  {{[],[],[],[],[],[],[],[],
    [["field1",65,65,65]],
    [],[],[],[],[],[],[]}}}

从上面可以看出,有些坐标我不明白它们的意思(数字1,16,16,8,80,48和一组空列表,它们也可能代表某些东西。

添加另外两行(键值对)会使数据看起来像:

D3 = dict:store("field3","CCC",D2).
{dict,3,16,16,8,80,48,
  {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
  {{[],[],
    [["field3",67,67,67]],
    [],[],[],[],[],
    [["field1",65,65,65]],
    [],[],[],[],
    [["field2",66,66,66]],
    [],[]}}}

从上面我可以注意到:

  • 第一个数字(3)重新设置DICT中的项目数。
  • 第二个数字(16)显示第一个列表元组中列表广告位的数量
  • 第三个数字(16)显示第二个列表中的列表插槽的数量,其中的值最终被放置在(中间)。
  • 第四个数字(8)似乎是放置值的第二行元组中的插槽数(一种索引指针)
  • 剩下的数字(80和48)......不知道......
  • 添加一个键“field0”不会放在最后,而是放在“field1”的数据之后。这表明了索引方法。

问题,是否有一种方法(算法)可靠地直接从Erlang外部创建DICT字符串?

1 个答案:

答案 0 :(得分:1)

可以在dict.erl源代码中找到有关如何实现dict的全面规范。

但我不确定复制dict.erl在Java中的实现是值得的。如果你想要一个像Java和Erlang代码之间需要经常传递的数据结构这样的快速字典,这才有意义。使用Erlang和Java的Key-Value存储可能更有意义而不直接传递它。根据您的应用,这可能是例如riak甚至可能会将您的不同语言世界与RabbitMQ联系起来。这两个示例都在Erlang中实现,并且可以从两个世界轻松访问。