> On Jun 26, 2017, at 10:20 , Charles Srstka <cocoa...@charlessoft.com> wrote: > > Rats, I was hoping that one of the reasons about being so explicit what we’re > going to access and where with bindMemory() and friends would be to take care > of these sorts of issues. > > In that case, the simplest way to do it is probably just this: > > let crc = (UInt16(myData[myData.endIndex]) << 8) | > UInt16(myData[myData.endIndex - 1]) > > (or the reverse, depending on the endianness of the source data)
Ah. I was doing it like this, but I guess I don't really need to, do I? let count = self.count let ourCRC = self.withUnsafeBytes { (inPtr: UnsafePointer<UInt8>) -> UInt16 in let b1 = UInt16(inPtr[count - 2]) let b2 = UInt16(inPtr[count - 1]) let b = (b1 << 8) | b2 return b } > > Charles > >> On Jun 26, 2017, at 12:05 PM, Philippe Hausler via swift-users >> <swift-users@swift.org> wrote: >> >> 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@swift.org> wrote: >>> >>> >>>> On Jun 26, 2017, at 1:55 AM, Daniel Vollmer via swift-users >>>> <swift-users@swift.org> wrote: >>>> >>>> Hi Rick, >>>> >>>>> On 26. Jun 2017, at 02:37, Rick Mann via swift-users >>>>> <swift-users@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@swift.org >>> https://lists.swift.org/mailman/listinfo/swift-users >> > -- Rick Mann rm...@latencyzero.com _______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users