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];
}
需要替代 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];
}