我想在 Java 中构造一个表示DICT术语的字符串,并将其传递给 Erlang 进程,以便作为 erlang 术语( string-to-term )反映回来。
我可以很容易地为 ORDDICT 实现这一点,因为它们在元组列表中构造为一个简单的排序键/值对,例如: [ {field1 , "value1"} , {field2 , "value2} ]
但是,对于 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 字符串?