如何解决在Visual Works Smalltalk中从CPointer创建CByteArray
某些C函数将aCPointer
返回到C struct
。
C 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:
完成。
此方法适用于ByteArray
和UninterpretedBytes
。如果您想从字节中读取数据,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 举报,一经查实,本站将立刻删除。