在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类型一起测试。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...