如何将BitArray转换为Data?是否需替换为[UInt8]?
解决BitArray转Data的两种方案
直接替换为[UInt8](最省心)
如果项目中BitArray的使用范围不大,直接换成[UInt8]是最直接的方案。因为Data可以直接通过Data(bytes: yourUInt8Array)初始化,拿到的Data就能直接传入writeValue(_:for:type:)方法,不需要额外写转换逻辑。给BitArray实现转Data的方法(保留原有结构)
要是项目里已经大量使用BitArray,不想大规模修改代码,可以给BitArray加个扩展来实现转Data的逻辑。假设你的BitArray是按单个比特存储元素的,参考下面的实现:extension BitArray { var data: Data { var bytes = [UInt8]() var currentByte: UInt8 = 0 var bitPosition = 0 for isSet in self { if isSet { currentByte |= 1 << (7 - bitPosition) } bitPosition += 1 if bitPosition == 8 { bytes.append(currentByte) currentByte = 0 bitPosition = 0 } } // 处理最后不足8位的剩余比特 if bitPosition > 0 { bytes.append(currentByte) } return Data(bytes) } }之后直接调用
yourBitArray.data就能得到符合要求的Data,传入目标方法即可。如果你的BitArray内部本身就是用[UInt8]存储的(比如部分第三方库的实现),直接取内部的数组转Data就行,不用重新打包。
内容的提问来源于stack exchange,提问作者Roman Podymov
相关产品推荐
相关产品推荐

