[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