Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Swift中创建C数组并将其指针传递给C函数(在Swift中)_Arrays_C_Swift_Pointers - Fatal编程技术网

Arrays 在Swift中创建C数组并将其指针传递给C函数(在Swift中)

Arrays 在Swift中创建C数组并将其指针传递给C函数(在Swift中),arrays,c,swift,pointers,Arrays,C,Swift,Pointers,给定类型 struct thin_头{ uint32_t偏移量; uint32_t尺寸; 结构马赫数割台; }; 和下面的函数签名 struct thin_header*headersFromBinary(struct thin_header*headers,NSData*binary,uint32\u t*amount); 我想把下面的代码转换成Swift struct thin_头文件[4]; uint32\u t numHeaders=0; headersFromBinary(标题、二

给定类型

struct thin_头{
uint32_t偏移量;
uint32_t尺寸;
结构马赫数割台;
};
和下面的函数签名

struct thin_header*headersFromBinary(struct thin_header*headers,NSData*binary,uint32\u t*amount);
我想把下面的代码转换成Swift

struct thin_头文件[4];
uint32\u t numHeaders=0;
headersFromBinary(标题、二进制和numHeaders);
到目前为止,我已经做了以下工作

var headers=thin_header()
var numHeaders=UInt32()
headersFromBinary(&headers、binary和numHeaders)

然而,我认为这没有意义,因为
应该是一个
瘦头
的数组。这段代码确实可以编译,并且在运行时不会导致错误,但是我如何能够循环通过瘦头数组呢?

我们正在进行Mach-O解析吗

基本上,您将无法做一些简单的事情,比如创建一个精简头数组。我已经有一段时间没有研究Mach-O格式规范了,但我认为它们遵循了相当常见的C技术,即定义结构,开始时有一些公共信息,但之后有不同的长度信息,因此,如果有
mach_头
它实际上可能是
mach_头_64
,您必须使用
大小
字段来确定哪个

因此,基本上,您需要能够按字节计数前进,但将任何给定位置视为精简头。如果要查看
大小
偏移量
以外的任何内容,还需要为不同的头类型定义不同的结构

struct ThinHeader
{
let offset:UInt32
尺寸:UInt32
}
结构faterheader32
{
让thinHder:ThinHeader
让我们休息一下:马赫数头
}
结构faterheader64
{
让thinHder:ThinHeader
让我们休息一下:马赫数头64
}
因此,要使用您提供的C API,您必须进行一些伪造:


var MACHHOHEADERDATA=数据(重复:0,计数:MemoryLayout.stride*maxHeaders)
var amount:UInt32=dhrData.count//我想这就是应该的结果
machoHeaderData.WithUnsafemtableBytes
{
$0.withMemoryRebound(收件人:thin_header.self)
{
_=headersFromBinary(&$0,ptrToBinary,&金额)
}
}
现在
machoHeaderData
将包含
headersFromBinary
返回的数组字节

machoHeaderData.withUnsafeBytes
{
var rawHdrPtr=$0.baseAddress

对于uu0..进行Mach-O分析,我们是吗

基本上,你不可能做一些简单的事情,比如制作一个薄头数组。我已经有一段时间没有看过Mach-O格式规范了,但我认为它们遵循了相当常见的C技术,即定义结构,在开始时有一些公共信息,但之后有不同的长度信息,所以你可以ve
mach_头
它实际上可能是一个
mach_头_64
,您必须使用
大小
字段来确定哪个

因此,基本上,您需要能够按字节计数前进,然后将任何给定位置视为精简头。如果您想查看除
size
offset
之外的任何内容,还需要为不同的头类型定义不同的结构

struct ThinHeader
{
let offset:UInt32
尺寸:UInt32
}
结构faterheader32
{
让thinHder:ThinHeader
让我们休息一下:马赫数头
}
结构faterheader64
{
让thinHder:ThinHeader
让我们休息一下:马赫数头64
}
因此,要使用您提供的C API,您必须进行一些伪造:


var MACHHOHEADERDATA=数据(重复:0,计数:MemoryLayout.stride*maxHeaders)
var amount:UInt32=dhrData.count//我想这就是应该的结果
machoHeaderData.WithUnsafemtableBytes
{
$0.withMemoryRebound(收件人:thin_header.self)
{
_=headersFromBinary(&$0,ptrToBinary,&金额)
}
}
现在
machoHeaderData
将包含
headersFromBinary
返回的数组字节

machoHeaderData.withUnsafeBytes
{
var rawHdrPtr=$0.baseAddress

为了将C代码直接转换为Swift,我将编写如下代码:

(假设您已将
二进制
准备为
数据

但是,我如何能够循环通过瘦_头数组呢


headers
作为如上所述的数组,您可以循环使用它。

要将C代码直接转换为Swift,我将编写如下代码:

(假设您已将
二进制
准备为
数据

但是,我如何能够循环通过瘦_头数组呢


headers
制作成如上所述的数组,您可以循环使用它。

我更新了我的答案,原因有两个。第一个是我没有真正回答如何从二进制文件调用
headers的问题。第二个是我对Mach-O头进行了快速刷新,所以我的答案需要一些小的修改。@ChipJarred谢谢您非常详细的答案非常详细!!不客气。在我答案末尾的迭代循环中,我假设
thin_头。size
是包含
thin_头本身的字节数。如果只有实际
mach_头的大小,那么您需要更改
MemoryLayout
引用使用
mach\u header
mach\u header\u 64
。我更新了我的答案有两个原因。第一个原因是我没有真正回答如何从二进制文件调用
headers的问题。第二个原因是我对mach-O headers进行了快速刷新,所以我的答案需要一些小的修改。@ChipJarred非常感谢您的帮助非常详细的答案!!不客气。在网站上
var headers: [thin_header] = Array(repeating: thin_header(), count: 4)
var numHeaders: UInt32 = 0
headersFromBinary(&headers, binary, &numHeaders)