[swift-users] Extracting arbitrary types (e.g. UInt16) out of Data

Philippe Hausler phausler at apple.com
Mon Jun 26 12:05:45 CDT 2017


Data.copyBytes will do that under the hood

var crc: UInt16 = 0
let amountCopied = withUnsafeMutablePointer(to: &crc) { data.copyBytes(to: UnsafeMutableBufferPointer(start: $0, count: 1)) }
if amountCopied == MemoryLayout<UInt16>.size {
    // we have a full crc
}

That will probably do what you want; plus it will allow you to do it from a given range of bytes.


> On Jun 26, 2017, at 9:57 AM, Joe Groff via swift-users <swift-users at swift.org> wrote:
> 
> 
>> On Jun 26, 2017, at 1:55 AM, Daniel Vollmer via swift-users <swift-users at swift.org> wrote:
>> 
>> Hi Rick,
>> 
>>> On 26. Jun 2017, at 02:37, Rick Mann via swift-users <swift-users at swift.org> wrote:
>> 
>> [snip]
>> 
>>> I'd also like to avoid unnecessary copying of the data. All of it is immutable for the purposes of this problem.
>>> 
>>> How can I get the UInt16 that starts at byte X in a Data? Same goes for Double or Int32 or whatever.
>> 
>> I’m not sure what Swift’s stance on this is, but not all platforms allow misaligned memory accesses (such as your attempt to access a UInt16 that lies at an odd memory address).
> 
> Unaligned memory accesses are not currently allowed by the language semantics, regardless of the underlying ISA. You should use memcpy if you need to load potentially-unaligned values out of raw memory.
> 
> -Joe
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users



More information about the swift-users mailing list