Objective C 中的 NSData 到 UInt16 的 NSArray

NSData to NSArray of UInt16 in Objective C

需要替代 Objective-C

中的以下 Swift 代码
let arr = data.withUnsafeBytes {
            Array(UnsafeBufferPointer<UInt16>(start: [=11=], count: data.count/MemoryLayout<UInt16>.stride))
}

感谢您的帮助,以下答案有所帮助,必须在 C++ 中执行此操作,就像在进行 tensorflow-lite 预处理一样。

UInt16 *adr = (UInt16 *)data.bytes;

uint16_t req_arr[data.length/sizeof(UInt16)];

for (int i = 0; i<data.length/sizeof(UInt16); ++i) {
    uint16_t num16 = *adr%UINT16_MAX;
    ++adr;
    your_arr[i] = num16;
}

你不能得到带有 UInt16 元素的 NSArray,因为 NSArray 只能包含 NSObjects,所以你必须将 UInt16 包装到 NSNumber 或使用一些其他容器(例如,简单的 c 数组)。最接近的代码将是这样的:

// Just preparing some test data
NSMutableData *data = [NSMutableData new];
for (int i = 0; i<10; ++i){
    UInt16 u = (UInt16) arc4random()%UINT16_MAX;
    NSLog(@"%d",u);
    [data appendBytes:&u length:sizeof(u)];
}

// the main code
UInt16 *adr = (UInt16 *)data.bytes;
NSMutableArray *arr = [NSMutableArray new];
for (int i = 0; i<data.length/sizeof(UInt16); ++i) {
    NSNumber *num = [NSNumber numberWithUnsignedShort:*adr];
    ++adr;
    [arr addObject:num];
}