设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3691|回复: 11
打印 上一主题 下一主题

[已经解决] 跨语言的API传递数组

[复制链接]

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
624
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

跳转到指定楼层
1
发表于 2010-6-21 11:53:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
呐,是这样的,我想在两个不同的语言编写的程序中传递数组,由于跨语言只能用API或者内存映射进行传递,并且都只能传字符,于是如何把数组转成字符进行传递
注意:
1.数组中的内容可能包含特殊字符,因此不能用指定特殊字符作为分隔符的方法
2.数组可能会嵌套
3.数组的中的元素只可能是数组或字符串

补充一下,所谓跨语言,是指VB、易和Ruby
pack貌似是个好东西,不过咱不太会用,有人可以教一下喵?另外这玩意包起来的在易和VB那边能不能解开。。

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
2
发表于 2010-6-21 12:04:41 | 只看该作者
1、用 Array#pack 方法。pack 默认不支持嵌套的数组,不过你可以把深层次的数组先 pack 成字符串,然后在外层的数组 pack 参数里用 p 表示该元素是一个 char * 指针

2、调用 Ruby 的 Marshal.dump 序列化数组对象,然后在另一端打开字节流读取数据重组数据结构。这巧了,刚好发了一篇关于 Marshal 格式的文章,如果你的数组里面只是整数数据的话,格式是很简单的:
http://rpg.blue/forum.php?mod=viewthread&tid=139590
回复 支持 反对

使用道具 举报

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
624
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

3
 楼主| 发表于 2010-6-21 12:06:39 | 只看该作者
数组的中的元素只可能是数组或字符串
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
4
发表于 2010-6-21 12:54:34 | 只看该作者
字符串的 Marshal 格式也很简单 o.o

刚才想了一下,pack 有两层以上字符串的话,就无法区分数组元素是字符串本身的指针还是子数组的指针了……Marshal 是可以区分的,但要是觉得 Marshal 格式麻烦的话也可以把数组直接转换成你觉得的可读模式,比如:
  1. class Array
  2.   def to_s
  3.     ret = "["
  4.     i = 0
  5.     self.each do |elem|
  6.       i += 1
  7.       if elem.class == String
  8.         ret << "\"" << elem.gsub(/"/, "\\\"") << "\""
  9.       else
  10.         ret << elem.to_s
  11.       end
  12.       ret << "," if i < length
  13.     end   
  14.     ret << "]"
  15.   end
  16. end



  17. arr = ["1", "2asdfa\"sdf", ["1\"", ["2", "3"], "3", "4"], "1", ["2"]]
  18. print arr.to_s
复制代码
然后你在其它语言中就可以自行解析这个数据的结构

评分

参与人数 1星屑 +400 收起 理由
zh99998 + 400 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
624
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

5
 楼主| 发表于 2010-6-21 14:02:02 | 只看该作者
- -表示这段代码跟inspect似乎没啥区别,
其实咱还想问的是,有没有某个通用的规范,就是在其他语言里也会有相应的解析库,自己写的拆字符串总感觉会有歧义字符什么的。。
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
46
在线时间
11 小时
注册时间
2009-6-4
帖子
210
6
发表于 2010-6-22 12:26:05 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

彩色的银子

梦石
0
星屑
50
在线时间
190 小时
注册时间
2006-6-13
帖子
1361

贵宾

7
发表于 2010-6-22 12:32:49 | 只看该作者
你可以自己定一个规范啊…
在链接库里写一个解释这个规范的东西就可以啦…
一般来说,没有这种,包含数组跟字符的东西…
-.-
回复 支持 反对

使用道具 举报

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
624
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

8
 楼主| 发表于 2010-6-22 13:18:10 | 只看该作者
你可以自己定一个规范啊…
在链接库里写一个解释这个规范的东西就可以啦…
一般来说,没有这种,包含数组跟 ...
神思 发表于 2010-6-22 12:32



-v-也就是说,没有通用的吗
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
9
发表于 2010-6-22 19:47:02 | 只看该作者
本帖最后由 紫苏 于 2010-6-22 19:50 编辑
- -表示这段代码跟inspect似乎没啥区别,
其实咱还想问的是,有没有某个通用的规范,就是在其他语言里也会 ...
zh99998 发表于 2010-6-21 14:02

汗掉,NC了,完全忘记 inspect 了……

这里的规范很明显,Marshal 首先是有明确定义的规范的;如果要用 inspect 的内容解析的话,规范就是:
未经转义的 [ 和 ] 之间是一个数组,未经转义的 " 和 " 之间是字符串,字符串之间由 , 分隔,其余内容均为字符串内容(我给的那段代码在字符串外不会有空格)
回复 支持 反对

使用道具 举报

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
624
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

10
 楼主| 发表于 2010-6-22 19:52:17 | 只看该作者
嗯,VB中有能直接读Marshal的库吗,还是要自己写解析?
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-1-12 12:20

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表