微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Visual Works Smalltalk中从CPointer创建CByteArray

如何解决在Visual Works Smalltalk中从CPointer创建CByteArray

某些C函数aCPointer返回到C structC struct是已知的。
现在,我想将C struct放入ByteArray中。基本上将结构的内容复制到ByteArray中。
gemstone / S 中,可以这样操作:
CByteArray fromCPointer: aCPointer numBytes: 120.
“这将创建一个CByteArray并使用CPointer引用的结构的内容(仅复制120个字节)”

Visual Works是否有类似的东西? 我还没有找到。 可以在Visual Works级别复制C结构,但是它只是一个结构,可以在较低级别处理它。

解决方法

只有丑陋的#copyAt:to:size:startingAt:可以发送给指针。您需要自己分配一个ByteArray(确保足够大)。

answer := ByteArray new: size.
pointer
        copyAt: 0
        to: answer
        size: size
        startingAt: 1.

另一种方法(字节数组->指针)将使用#copyAt:from:size:startingAt:完成。

此方法适用于ByteArrayUninterpretedBytes。如果您想从字节中读取数据,UninterpretedBytes可能会更有用,因为您可以发送诸如#longAt:之类的内容来从偏移量读取long

,

如果aCPointer指向char *的结构,例如:

struct Names 
{char * name;
char * longname;} name;

然后:

(aCPointer at: 0) copyCStringFromHeap. "answer [name]"
(aCPointer at: 1) copyCStringFromHeap. "answer [longname]"

对于具有char *的结构,它可以很好地与其他C类型一起测试。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。