簡體   English   中英

OSReadLittleInt16()如何轉換為Swift?

[英]How does OSReadLittleInt16() translate to Swift?

我想將我的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中不可用。 我需要導入什么東西嗎?

OSReadLittleInt16usr/include/libkern/OSByteOrder.h

使用.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))")

ui0:3231
ui1:3433

be0:3132
be1:3334

le0:3231
le1:3433

請注意,iOS中的默認值是little endian。

這是一種替代方法: OSReadLittleInt16()<libkern/OSByteOrder.h>定義為宏,如下所示:

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

宏不會導入到Swift中,但_OSReadInt16()函數已導入,因此您可以執行

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

一個可能的優點是,即使架構僅允許對齊的內存訪問,這也適用於奇數偏移量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM