问题描述
某些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类型一起测试。