OSReadLittleInt16()如何转换为Swift?

时间:2015-10-14 15:26:44

标签: swift swift2

我想将我的Obj-C代码翻译成Swift。

我在Obj-C中得到了这3行:

NSData* data = ...
unsigned char* bytes = (unsigned char*) data.bytes;
int16_t delta = OSReadLittleInt16(opticalEncoderBytes, 0);

前两行转换为:

NSData data = ...
let bytes = UnsafePointer<UInt8>(data.bytes)

第三行不是那么容易,我不知道:

  1. int16_t只是转换为Int16吗?
  2. OSReadLittleInt16在Swift中不可用。我需要导入一些东西吗?
  3. OSReadLittleInt16usr/include/libkern/OSByteOrder.h

    中定义

2 个答案:

答案 0 :(得分:1)

使用.bigEndian.littleEndian

let i :Int16 = 1
print("i: \(i)")
let le :Int16 = i.littleEndian
print("le: \(le)")
let be :Int16 = i.bigEndian
print("be: \(be)")
  

我:1   le:1
  是:256

let data: NSData! = "12345678".dataUsingEncoding(NSUTF8StringEncoding)
let bytes = UnsafePointer<UInt16>(data.bytes)

let ui0 = bytes[0]
let ui1 = bytes[1]
print("ui0: \(String(ui0, radix:16))")
print("ui1: \(String(ui1, radix:16))")

let be0 = bytes[0].bigEndian
let be1 = bytes[1].bigEndian
print("be0: \(String(be0, radix:16))")
print("be1: \(String(be1, radix:16))")

let le0 = bytes[0].littleEndian
let le1 = bytes[1].littleEndian
print("le0: \(String(le0, radix:16))")
print("le1: \(String(le1, radix:16))")
  up0:3231
  ui1:3433

     

be0:3132
  be1:3334

     

le0:3231
  le1:3433

请注意,iOS中的默认值是小端。

答案 1 :(得分:1)

以下是另一种方法:OSReadLittleInt16()是已定义的 作为<libkern/OSByteOrder.h>中的宏

#define OSReadLittleInt16(base, byteOffset) _OSReadInt16(base, byteOffset)

宏未导入Swift,但_OSReadInt16() 功能是,所以你可以做到

let delta = UInt16(littleEndian: _OSReadInt16(bytes, 0))

一个可能的优点是,这也适用于奇数偏移,即使该架构仅允许对齐内存访问。