ios – Swift中的二进制文件IO

ios – Swift中的二进制文件IO,第1张

概述编辑:TLDR在C系列语言中,您可以通过转换将任意数据(整数,浮点数,双精度,结构)表示为字节流,并将它们打包到流或缓冲区中.你可以反过来取回数据.当然,你可以字节交换字节顺序正确性. 这在惯用语中是否可行? 现在原来的问题: 如果我在C/C++ / ObjC中编写,我可能会将一个结构转换为unsigned char *并将其字节写入FILE *,或将它们memcpy到缓冲区.对于整数,双打等也是 编辑:TLDR在C系列语言中,您可以通过转换将任意数据(整数,浮点数,双精度,结构)表示为字节流,并将它们打包到流或缓冲区中.你可以反过来取回数据.当然,你可以字节交换字节顺序正确性.

这在惯用语中是否可行?

现在原来的问题:

如果我在C/C++ / ObjC中编写,我可能会将一个结构转换为unsigned char *并将其字节写入file *,或将它们memcpy到缓冲区.对于整数,双打等也是如此.我知道有一些关于endianness的问题需要处理,但这适用于iOS应用程序,并且我不认为endianness会在不久的将来更改平台. Swift的类型系统似乎不允许这种行为(将任意数据转换为无符号8位整数并传递地址),但我不知道.

我正在学习Swift,并希望用一种惯用的方式来编写我的数据.请注意,我的数字很高,最终将通过网络发送,因此它需要紧凑,所以像JsON这样的文本格式已经出来了.

我可以使用NSKeyedArchiver,但我想在这里学习.此外,我不想在未来的某个时刻注销一个Android客户端,所以一个简单的二进制编码似乎在它的位置.

有什么建议?

解决方法 如 @L_301_2@所述,您可以将Swift类型的数组传递给指针类型的参数/变量,反之亦然,以获得二进制表示.如果您定义自己的结构类型,这甚至可以工作,就像在C中一样.

这是一个例子 – 我使用这样的代码来封装GPU的3D顶点数据(使用SceneKit,OpenGL等):

struct float3 {    var x,y,z: GLfloat}struct Vertex {    var position,normal: float3}var vertices: [Vertex] // initialization omitted for brevitylet data = NSData(bytes: vertices,length: vertices.count * sizeof(Vertex))

检查这些数据,您将看到32 * 3 * 2位IEEE 754浮点数的模式(就像您通过指针访问序列化C结构一样).

为了向另一个方向发展,您有时可能需要unsafeBitCast.

如果您将其用于数据持久性,请务必检查或强制使用字节顺序.

总结

以上是内存溢出为你收集整理的ios – Swift中的二进制文件IO全部内容,希望文章能够帮你解决ios – Swift中的二进制文件IO所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1114948.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存