简体   繁体   English

Swift将Int16和Int32 var串联为一个多字节实体

[英]Swift concatenating Int16 and Int32 vars into a multi-byte entity

I am writing code to read and write file using a rigidly defined binary format. 我正在编写使用严格定义的二进制格式读写文件的代码。 I have a mixture of Int16 and Int32 values, which are defined as a 240 byte structure. 我混合使用Int16和Int32值,它们被定义为240字节结构。 How do I concatenate these values into this single structure? 如何将这些值连接到单个结构中?

here is an example, you can custom your own init method, use loop if there two many repeated length 这是一个示例,您可以自定义自己的init方法,如果有两个重复的长度,则使用loop

public struct HistoryRecord {
    public let sequence: UInt8
    let impFlag: UInt8
    let mode: UInt8
    let power: UInt16
    let utc: UInt32
    let weight: UInt16
    let impedance: UInt16

    private let sequenceLength = 1
    private let modeLength = 1
    private let powerLength = 2
    private let utcLength = 4
    private let weightLength = 2
    private let impedanceLength = 2

    public init() {
        sequence = 0
        impFlag = 0
        mode = 0
        power = 0
        utc = 0
        weight = 0
        impedance = 0
    }

    public init?(_ data: NSData) {
        let needLength = sequenceLength + modeLength + powerLength + utcLength + weightLength + impedanceLength
        guard data.length == needLength else {
            return nil
        }
        var bufferUInt8: UInt8
        var bufferUInt16: UInt16
        var bufferUInt32: UInt32

        bufferUInt8 = 0
        data.getBytes(&bufferUInt8, range: NSMakeRange(0, sequenceLength))
        sequence = bufferUInt8

        bufferUInt8 = 0
        data.getBytes(&bufferUInt8, range: NSMakeRange(sequenceLength, modeLength))
        impFlag = (bufferUInt8 >> 4) & 0x00ff
        mode = bufferUInt8 & 0x00ff


        bufferUInt16 = 0
        data.getBytes(&bufferUInt16, range: NSMakeRange(sequenceLength + modeLength, powerLength))
        power = bufferUInt16.bigEndian

        bufferUInt32 = 0
        data.getBytes(&bufferUInt32, range: NSMakeRange(sequenceLength + modeLength + powerLength, utcLength))
        utc = bufferUInt32.bigEndian

        bufferUInt16 = 0
        data.getBytes(&bufferUInt16, range: NSMakeRange(sequenceLength + modeLength + powerLength + utcLength, weightLength))
        weight = bufferUInt16.bigEndian

        bufferUInt16 = 0
        data.getBytes(&bufferUInt16, range: NSMakeRange(sequenceLength + modeLength + powerLength + utcLength + weightLength, impedanceLength))
        impedance = bufferUInt16.bigEndian

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM