我无意间发现了一些对我来说毫无意义的东西。我的问题在代码注释中和下面:
[SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)]
[StructLayout(LayoutKind.Sequential, Size = 4096)]
public unsafe struct BufItems
{
public fixed byte Buffer[4096];
}
public class Wrapper
{
public BufItems Items;
public int Id;
}
private unsafe void button10_Click(object sender, EventArgs e)
{
Wrapper wrap = new Wrapper();
wrap.Id = 123;
fixed(BufItems* ptr = &wrap.Items)
{
ptr->Buffer[0] = 99; // works fine
}
// fixed (Wrapper w = wrap) { /* not possible */ };
// fixed (Wrapper* w = &wrap) { /* not possible …Run Code Online (Sandbox Code Playgroud) class someClass
{
public:
int* ptr2Int;
};
Run Code Online (Sandbox Code Playgroud)
Is this a valid class (yes it compiles)? Provided one assigns a value to ptr2Int before dereferencing it, is the class guaranteed to work as one would expect?
我在Objective-C库的回调中收到了其中一个: UnsafeMutablePointer<UInt8>
我能够解析它.我也可以创建一个将它发送回图书馆,但是:使用"不安全"类型有什么风险?我该如何避免这些风险?
另外,Objective-C库正在使用uint8_t *与Swift的桥接器UnsafeMutablePointer<UInt8>......这对于Swift互操作来说是最好的吗?
我想创建一个UnsafeMutablePointer仅影响的扩展UnsafeMutablePointer<UInt8>......
我知道这些说明是相关的,但我不确定如何:
\n\n\n\n\n扩展泛型类型时,不提供类型参数列表作为扩展\xe2\x80\x99s 定义的一部分。相反,原始类型定义中的类型参数列表在扩展主体中可用,并且原始类型参数名称用于引用原始定义中的类型参数。
\n
基本上,我正在尝试使用这种方法:
\n\nfunc toSwift(length: Int) -> [Int] {\n var retVal : [Int] = []\n for i in 0..<length {\n retVal.append(Int(self[i]))\n }\n return retVal\n}\nRun Code Online (Sandbox Code Playgroud)\n\n采取行动,self无需UnsafeMutablePointer<UInt8>...这可能吗?
如何创建 UnsafePointer?尝试让 mediaBoxPtr = UnsafePointer(mediaBox) 但失败
func PDFImageData(filter: QuartzFilter?) -> NSData? {
let pdfData = NSMutableData()
let consumer = CGDataConsumerCreateWithCFData(pdfData);
var mediaBox = CGRect(x: 0, y: 0, width: bounds.size.width, height: bounds.size.height)
let mediaBoxPtr : UnsafePointer<CGRect> = nil //???? I need CGRect(x:0, y:0, bounds.size.width, bounds.size.height)
if let pdfContext = CGPDFContextCreate(consumer, mediaBoxPtr, nil) {
filter?.applyToContext(pdfContext)}
Run Code Online (Sandbox Code Playgroud) 我正在从Swift的目标C类中调用函数。
-(char *)decrypt:(char *)crypt el:(int)el{}
Run Code Online (Sandbox Code Playgroud)
从swift调用此函数时,它要求提供一个UnsafeMutablePointer<Int8>作为参数“ crypt”的值
“ crypt”的值来自服务器,它是base64编码的字符串。因此,我对该字符串进行了解码,并得到了一个Data对象。
let resultData = Data(base64Encoded: base64String)
Run Code Online (Sandbox Code Playgroud)
现在,我需要将此数据传递给上述函数。我试图将此Data对象转换为UnsafeMutablePointer<Int8>
resultData?.withUnsafeBytes { (u8Ptr: UnsafeMutablePointer<Int8>) in
let decBytes = tea?.decrypt(u8Ptr , el: el)}
Run Code Online (Sandbox Code Playgroud)
但是它没有编译。给出以下错误
“ UnsafeMutablePointer”不能转换为“ UnsafePointer <_>”
我对目标c不太了解。因此,谁能帮助我将此参数传递给目标c函数。
我想创建一个包装 libcsem_post和sem_wait函数的 Rust 信号量,它们都采用可变int *参数。这要求服务员和海报同时拥有一个指向同一个 int 的可变指针。我该如何安排而不冒 UB 的风险?
我的一个想法是使用UnsafeCell:
use libc;
use std::cell::UnsafeCell;
pub struct Sema {
sema: UnsafeCell<i32>,
}
impl Sema {
pub fn post(&self) {
unsafe { libc::sem_post(self.sema.get()) };
}
pub fn wait(&self) {
unsafe { libc::sem_wait(self.sema.get()) };
}
}
Run Code Online (Sandbox Code Playgroud)
这安全吗?有更好的方法吗?谢谢你的帮助!