将Objective-C memcpy转换为Swift
我的任务是将一些功能从Objective-C转换为Swift。我们正在使用C文件将文件传输到蓝牙设备。下面是需要转换的Objective-C代码 从Objective-C文件:将Objective-C memcpy转换为Swift,objective-c,swift,Objective C,Swift,我的任务是将一些功能从Objective-C转换为Swift。我们正在使用C文件将文件传输到蓝牙设备。下面是需要转换的Objective-C代码 从Objective-C文件: NSString *room_name = filename; NSData* bytes = [room_name dataUsingEncoding:NSUTF8StringEncoding]; UInt8 buff_name[bytes.length+1]; memcpy(buff_name, [room_name
NSString *room_name = filename;
NSData* bytes = [room_name dataUsingEncoding:NSUTF8StringEncoding];
UInt8 buff_name[bytes.length+1];
memcpy(buff_name, [room_name UTF8String],[room_name lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1);
我一直坚持使用Swift的
memcpy
,不确定这是否是我们正在尝试的最安全的方法。谢谢。我表示哀悼,因为您收到的代码有点乱。首先,它从room_name
生成一个NSData
,在这个过程中将字符串转换为UTF-8,但它不使用该NSData
来确定缓冲区的大小,然后再次将字符串转换为UTF-8并将其复制到新的缓冲区中。从计算性和可读性的角度来看,这比它需要的效率要低得多
如果我们把它留在Objective-C中,我们已经想清理代码了。但是,在Swift中,我们可以使其更清晰,因为String
有一个非常好且简单的方法来为我们获取字符串UTF-8表示形式的指针:
filename.withCString { ptr in
// call whatever C-based functions expect a `const char *` pointer here
}
注意这里的指针是不可变的。如果您正在调用的C函数期望能够修改缓冲区,那么您将需要创建一个副本。有几种方法可以做到这一点,但最简单的方法可能是:
guard var data = filename.data(using: .utf8) else {
// handle this error somehow
}
data.withUnsafeMutableBytes { (ptr: UnsafeMutablePointer<Int8>) in
// call whatever C-based functions expect a `char *` pointer here
// (if you need `unsigned char *`, use `UInt8` instead of `Int8`)
}
guard var data=filename.data(使用:.utf8)else{
//以某种方式处理这个错误
}
data.withUnsafeMutableBytes{(ptr:UnsafeMutablePointer)位于
//调用任何基于C的函数,在这里需要一个`char*`指针
//(如果需要“unsigned char*”,请使用“UInt8”而不是“Int8”)
}
这里的代码可能比问题所需的更多。为了让将来通过搜索找到这个问题的人更清楚,你能删除与memcpy
问题无关的部分吗?@CharlesSrstka更新。更糟糕的是,所有的评论都是中文的。@temp_uu请稍候。每隔一段时间给小猫放一段视频可能有助于保持你的理智。