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技术,即定义结构,在开始时有一些公共信息,但之后有不同的长度信息,所以你可以vemach_头
它实际上可能是一个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)