- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
随着 Swift 3 倾向于 Data
而不是 [UInt8]
,我试图找出将各种数字类型(UInt8、Double、Float、Int64 等)编码/解码为 Data 对象的最有效/惯用方法。
有this answer for using [UInt8] ,但它似乎使用了我在数据上找不到的各种指针 API。
我基本上想要一些看起来像这样的自定义扩展:
let input = 42.13 // implicit Double
let bytes = input.data
let roundtrip = bytes.to(Double) // --> 42.13
最佳答案
注意:代码已更新为 swift 5 (Xcode 10.2) 现在。 (Swift 3 和 Swift 4.2 版本可以在编辑历史记录中找到。)现在也可以正确处理可能未对齐的数据。
如何创建 Data
从一个值
从 Swift 4.2 开始,可以简单地从一个值创建数据
let value = 42.13
let data = withUnsafeBytes(of: value) { Data($0) }
print(data as NSData) // <713d0ad7 a3104540>
withUnsafeBytes(of: value)
Data($0)
可用于创建数据。 Data
中检索值
withUnsafeBytes(_:)
的
Data
使用“无类型”
UnsafeMutableRawBufferPointer
调用闭包到字节。
load(fromByteOffset:as:)
方法从内存中读取值:
let data = Data([0x71, 0x3d, 0x0a, 0xd7, 0xa3, 0x10, 0x45, 0x40])
let value = data.withUnsafeBytes {
$0.load(as: Double.self)
}
print(value) // 42.13
Data
的切片获得的值(value)。
let data = Data([0x71, 0x3d, 0x0a, 0xd7, 0xa3, 0x10, 0x45, 0x40])
var value = 0.0
let bytesCopied = withUnsafeMutableBytes(of: &value, { data.copyBytes(to: $0)} )
assert(bytesCopied == MemoryLayout.size(ofValue: value))
print(value) // 42.13
withUnsafeMutableBytes(of:_:)
使用覆盖值的原始字节的可变缓冲区指针调用闭包。 copyBytes(to:)
DataProtocol
的方法(Data
符合)将字节从数据复制到该缓冲区。 copyBytes()
的返回值是复制的字节数。它等于目标缓冲区的大小,如果数据不包含足够的字节,则小于等于目标缓冲区的大小。
struct Data
的通用方法:
extension Data {
init<T>(from value: T) {
self = Swift.withUnsafeBytes(of: value) { Data($0) }
}
func to<T>(type: T.Type) -> T? where T: ExpressibleByIntegerLiteral {
var value: T = 0
guard count >= MemoryLayout.size(ofValue: value) else { return nil }
_ = Swift.withUnsafeMutableBytes(of: &value, { copyBytes(to: $0)} )
return value
}
}
T: ExpressibleByIntegerLiteral
在这里添加,以便我们可以轻松地将值初始化为“零”——这并不是真正的限制,因为无论如何该方法都可以与“trival”(整数和浮点)类型一起使用,见下文。
let value = 42.13 // implicit Double
let data = Data(from: value)
print(data as NSData) // <713d0ad7 a3104540>
if let roundtrip = data.to(type: Double.self) {
print(roundtrip) // 42.13
} else {
print("not enough data")
}
Data
然后回来:
extension Data {
init<T>(fromArray values: [T]) {
self = values.withUnsafeBytes { Data($0) }
}
func toArray<T>(type: T.Type) -> [T] where T: ExpressibleByIntegerLiteral {
var array = Array<T>(repeating: 0, count: self.count/MemoryLayout<T>.stride)
_ = array.withUnsafeMutableBytes { copyBytes(to: $0) }
return array
}
}
let value: [Int16] = [1, Int16.max, Int16.min]
let data = Data(fromArray: value)
print(data as NSData) // <0100ff7f 0080>
let roundtrip = data.toArray(type: Int16.self)
print(roundtrip) // [1, 32767, -32768]
Array
和
String
具有(隐藏)指向底层存储的指针,并且不能被
Data
的方法然后回来:protocol DataConvertible {
init?(data: Data)
var data: Data { get }
}
extension DataConvertible where Self: ExpressibleByIntegerLiteral{
init?(data: Data) {
var value: Self = 0
guard data.count == MemoryLayout.size(ofValue: value) else { return nil }
_ = withUnsafeMutableBytes(of: &value, { data.copyBytes(to: $0)} )
self = value
}
var data: Data {
return withUnsafeBytes(of: self) { Data($0) }
}
}
Data
的类型。然后回来:extension Int : DataConvertible { }
extension Float : DataConvertible { }
extension Double : DataConvertible { }
// add more types here ...
let value = 42.13
let data = value.data
print(data as NSData) // <713d0ad7 a3104540>
if let roundtrip = Double(data: data) {
print(roundtrip) // 42.13
}
extension String: DataConvertible {
init?(data: Data) {
self.init(data: data, encoding: .utf8)
}
var data: Data {
// Note: a conversion to UTF-8 cannot fail.
return Data(self.utf8)
}
}
let value = 1000
let data = value.bigEndian.data
print(data as NSData) // <00000000 000003e8>
if let roundtrip = Int(data: data) {
print(Int(bigEndian: roundtrip)) // 1000
}
关于swift - 往返 Swift 数字类型到/从数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38023838/
考虑以下示例: >>> from IPython.core.inputtransformer2 import TransformerManager >>> src = """\ ... foo = !
所以我构建 Django 应用程序已经有一段时间了,喝了很酷的东西:只使用 ORM,从不编写自定义 SQL。 一旦您拥有大量用户特定内容(即照片、 friend 、其他数据等),网站的主页(用户将花费
我想使用 Excel 的 XML Map Web 应用程序中来自服务器端 C# 的功能。 XML 映射使您能够将 XML 架构与工作簿相关联,并指定哪些单元格映射到架构的哪些部分。您可以从那里导入 X
Closed. This question needs to be more focused。它当前不接受答案。
我有一个简单但具有挑战性的算法问题要解决。 我有一个交易员 - 股票 - 日级别的数据集,我想识别数据中的往返行程。往返只是数据中的特定序列。也就是说,如果您随着时间的推移累积个人 i 的股票 s 持
是否有一种可靠的方法可以将 HTTP cookie 值精确往返一次? 例如 Set-Cookie: name=value; Max-Age=1; ...但 Max-Age 以增量秒为单位而不是 #re
随着 Swift 3 倾向于 Data而不是 [UInt8] ,我试图找出将各种数字类型(UInt8、Double、Float、Int64 等)编码/解码为 Data 对象的最有效/惯用方法。 有th
我有一个具有以下结构的小部件(它是“计划选择器”简历): 我的指令如下: plans.directive('resume', function()
我们观察到所有消息的 RTT Kafka 延迟较高。 这是我们的实际配置: 我们有 3 个 Kafka 代理 + 3 个 Zookeeper 在 EC2 服务器上的 Kubernetes 集群中运行
使用 Newtonsoft.Json 库,想象一下 public class Test { public Object Obj { get; set; } } 现在,尝试像这样序列化它 var
这里和网络上有很多文章,但这些文章都针对不同的 Objectify 版本,并且由于某种原因似乎不起作用。 我有一个实体,它引用另一个实体(例如,帐户实体引用用户实体): @Cache @Entity
问题:当 SubSonic 对象通过 Windows Communication Foundation 服务来回发送时,如何保留它们的“脏”? 即: 我有一个返回 SubSonic (2.2) 对象集
我想使用 golang 的 xml.MarshalIndent() 快速创建一个实用程序来格式化任何 XML 数据 但是this code package main import ( "enc
我需要有关子流程模块的帮助。这个问题听起来可能是重复的,而且我已经在很多方面看到过很多与之相关的文章。但即便如此我也无法解决我的问题。其过程如下: 我有一个C程序2.c,其内容如下: #include
在尝试创建一些 FFI 帮助程序代码时,我对 Box 这种看似简单的用法感到头疼。 当与具有字段的结构一起使用时,此处的示例似乎给出了 free(): invalidpointer 错误。 pub s
我有两个函数用于在 Blob 和字节数组之间进行转换: function arrayToBlob(data) { return new Blob(data); } function blobT
我一直在尝试将带有 INTO OUTFILE 的 mysql 表导出为 CSV 以便在 Excel 中进行编辑,然后使用 LOAD DATA INFILE 插入回 mysql。 我可以导出 ok,甚至
我正在 Web 服务中实现条件请求。后端可以轻松检索实体的最后修改日期,因此我发送 Last-Modified 并返回 If-Modified-Since。 RFC for HTTP Dates指定与
我正试图找到一种方法来完成 xsd 模式到数据存储区的往返,而工作量最小。 我使用 jaxb 从模式构建我的对象模型,现在我想基于 JPA(或 JDO 或其他?)存储这些对象。是否可以根据 JAXB
我正在使用 DataAnnotations、jQuery.validate 和 jquery.validate.unobtrusive 创建一个日期范围验证器。我已经阅读了以下内容: http://b
我是一名优秀的程序员,十分优秀!