Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Objective-C memcpy转换为Swift_Objective C_Swift - Fatal编程技术网

将Objective-C memcpy转换为Swift

将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

我的任务是将一些功能从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 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请稍候。每隔一段时间给小猫放一段视频可能有助于保持你的理智。