在 Swift 中转换为不同的 C 结构不安全指针

2023-11-30

我想调用 Posix 套接字函数socket and bind来自斯威夫特。socket很容易——需要Int32s, but bind造成了问题,因为我有一个sockaddr_in指针,但它需要一个sockaddr指针。在 C 语言中,这将是一个强制转换,例如:

bind(sock, (struct sockaddr *)&sockAddress, sizeof(sockAddress))

这是 Swift 中的尝试:

let sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)
var sockAddress = sockaddr_in()        
bind(sock, &sockAddress, UInt32(MemoryLayout<sockaddr_in>.size))

The bind行无法编译:无法将类型“sockaddr_in”的值转换为预期参数类型“sockaddr”

如何投射指针?


你可以这样写:

withUnsafePointer(to: &sockAddress) {sockaddrInPtr in
    sockaddrInPtr.withMemoryRebound(to: sockaddr.self, capacity: 1) {sockaddrPtr in
        bind(sock, sockaddrPtr, UInt32(MemoryLayout<sockaddr_in>.stride))
    }
}

或者有人建议这可能更好:

withUnsafePointer(to: &sockAddress) {sockaddrInPtr in
    let sockaddrPtr = UnsafeRawPointer(sockaddrInPtr).assumingMemoryBound(to: sockaddr.self)
    bind(sock, sockaddrPtr, UInt32(MemoryLayout<sockaddr_in>.stride))
}

本文可能有一些帮助。


(更新) 如中所述Martin R 显示的链接, now MemoryLayout<T>.stride and MemoryLayout<T>.size返回与C一致的相同值sizeof,其中 T 是导入的 C 结构体。我会保留我的stride答案的版本在这里,但现在在这种情况下这不是“必需的”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Swift 中转换为不同的 C 结构不安全指针 的相关文章

  • 如何单击“取消”按钮退出搜索?

    我有一个带有取消按钮的搜索栏 但是当我单击 取消 按钮时 它不会关闭搜索栏 如何使单击 取消 时将搜索栏返回到第一个状态 如果您有任何疑问 请询问我 您需要实现 UISearchBarDelegate class ViewControlle
  • 错误域 = NSCocoaErrorDomain 代码 = 3840 “字符 0 周围的值无效

    嗨 我是 swift 的新手 我遇到了问题 我用 post 方法向服务器发出了请求 我得到了良好的 Json 响应 之后我用 get 方法发出了另一个请求 但我收到了这个错误 Error responseSerializationFaile
  • AWS Cognito / 从子节点获取用户信息

    我有一个使用 AWS Cognito AWSMobileClient 的工作 iOS 应用程序 用户可以使用 AWSAuthUI 登录和登录 注销 接下来我想做的是 拥有另一个用户的子 例如 7y873ff7 u9h4k 我想从其他用户那里
  • 在 Swift 中解码 JSON Web 令牌

    尝试在 Swift 中解码 JWT 有效负载 但遇到了很大的困难 static func decodePayload tokenstr String splitting JWT to extract payload let arr spli
  • 使用 swift 自动滚动 UITextView (IOS 应用程序)

    我似乎无法找到自动滚动的正确解决方案UITextView using Swift 对于我的应用程序 我从 BT 接收持续数据 并且我正在更新它UITextView 然而 当UITextView将到达最新更新的行 我将不得不手动滚动 我想要实
  • iOS 应用程序在 segue 处崩溃(断点发生在 func prepareForSegue 处)

    更新 我发现 仅通过阅读代码来调试是非常困难的 特别是在这样的情况下 https www dropbox com s ty3clsvgednzevj LoaferMap 20for 20iPhone 20copy 202 zip dl 0
  • Swift 中的运行时错误处理

    我完全知道 Swift 没有 try catch 机制来捕获异常 好吧 Swift 2 0 现在支持它们 我还了解到 许多 API 方法都会返回一个 NSError 如果出现问题 该错误对象将被填充为错误对象 所以请不要向我指出这个问题 S
  • 使用 Swift 使用 SOAP Web 服务

    我期望从 w3schools com 返回 XML SOAP 响应 http www w3schools com webservices tempconvert asmx http wwww w3schools com webservice
  • 如何使用 Swift 4 将字符串拆分为英语和非英语?

    我有一个包含英语和阿拉伯语的字符串 我正在使用 API 这就是为什么我无法在其中设置指标的原因 我想要得到的是 阿拉伯语和英语分成两部分 这是一个示例字符串 Bismika rabbee wadaAAtu janbee wabika arf
  • 没有这样的模块“Ensembles”错误 - 导入 Objective-C 框架以在 swift 项目中使用

    我将 Ensembles 添加到我的 Swift 项目 在这里找到https github com drewmccormack ensembles https github com drewmccormack ensembles 我没能在我
  • 如何从 Swift 调用 Objective-C 代码?

    在 Swift 中 如何调用 Objective C 代码 Apple 提到它们可以在一个应用程序中共存 但这是否意味着在技术上可以重用 Objective C 中创建的旧类 同时在 Swift 中构建新类 在 Swift 中使用 Obje
  • 对于 Swift 中的计算器

    只是要警告你 我是 Swift 的新手 我仍在适应它的工作原理 我一直在尝试在课堂上完成这个计算器项目 问题是 我需要练习简化代码 现在 当按下数字按钮时 我将其保存在这样的数组中 IBAction func buttonPressed s
  • 从数组中获取随机字符串[重复]

    这个问题在这里已经有答案了 我试图从数组 firstArray 中获取随机字符串并将其打印在 UILabel label 中 我似乎无法弄清楚并且出现错误 感谢您的帮助 我尝试搜索但找不到任何最新的教程 方法 import UIKit cl
  • 带闭包的默认属性值使编译器重新编译所有文件

    This source https developer apple com library content documentation Swift Conceptual Swift Programming Language Initiali
  • 使用 iOS 8 自定义键盘发送图像?

    我一直在为 iOS 8 开发自定义键盘 但在尝试使用键盘发送图像时偶然发现了一个问题 我做了一些研究 似乎没有一种简单的方法可以做到这一点UITextDocumentProxy因为只有NSStrings被允许 我是否忽略了使用自定义键盘发送
  • UIButton 导致无法识别的选择器发送到实例

    我正在尝试使用 for 循环创建多个按钮 但在使用 sender 函数时遇到问题 我有以下代码 func setUpButtons for i in 1 3 let btn UIButton UIButton frame CGRect x
  • 确定 SceneKit 中 SKVideoNode 的视频大小/长宽比

    如何从 AVPlayer 获取视频的视频大小来设置节点的几何大小 例如 我有一个具有宽度和高度的 SCNPlane let planeGeo SCNPlane width 5 height 5 所以现在我实例化我的视频播放器 let vid
  • 如何使用 Swift 使用 TouchID?

    Apple 为 iOS 8 的 TouchID 实现提供的文档采用 Objective C 语言 有 Swift 版本吗 Objective C IBAction touchIDAvailable UIButton touchIDAvail
  • Swift:使具有相同“形状”的两种类型符合通用协议

    我有两种不同的类型 它们代表相同的数据 并且具有完全相同的 形状 这两种不同的类型是代码生成的 我被迫处理它们 但是 我想让它们符合一个通用的协议 这样我就可以对这两种类型一视同仁 这是一个例子 假设这是我所坚持的两种代码生成类型 stru
  • SwiftUI:发送电子邮件

    在正常情况下UIViewController在 Swift 中 我使用此代码发送邮件 let mailComposeViewController configuredMailComposeViewController mailCompose

随机推荐

  • 雅虎财经 python 上的某些股票和页面出现 404 错误

    我正在尝试通过此 URL 从雅虎财经抓取数据https finance yahoo com quote AAPL key statistics p AAPL 运行下面的 python 代码后 我得到以下 HTML 响应 import num
  • 反转非唯一字典

    我有一本字典 需要根据非唯一值进行反转和分组 该字典根据现有的最佳答案而失败 gt gt gt graph a car red b car blue gt gt gt inv map gt gt gt for k v in graph it
  • 在处理中获取多个音频输入

    我目前正在编写一个需要访问多个音频输入的处理草图 但处理只允许访问默认线路 我尝试直接从 Java 混合器获取线路 在处理中访问 但我仍然只获得信号从我的机器上当前设置为默认值的那一行开始 我已经开始考虑按照建议通过 OSC 从 Super
  • 通过 AJAX 进行表单处理 - 避免生成 GET 和 POST 请求

    我正在尝试通过 AJAX 发送表单数据 但我看到 GET 和 POST 请求都正在生成 这是我的表单的提交处理程序
  • std::ostream 到 QDataStream

    我已经为 MyClass 重载了 friend std ostream operator lt lt std ostream out const MyClass Obj 现在我想将 std ostream 转换为 QDataStream 而
  • 为什么ld输出的二进制文件无法执行?

    我使用的是 Ubuntu 18 04 x86 64 这是我的程序的两个源文件 main c include stdio h int sum int a int n int array 2 1 2 int main int val sum a
  • PyTables 的优点是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我最近开始学习PyTabl
  • 在 R 中自定义传单地图图标

    我开始学习如何使用传单地图中的搜索功能 下面是传单地图 它允许您搜索城市 即单个搜索词 library leaflet library leaflet extras library dplyr using the same reproduc
  • 如何使 Flex 仅在有用时消耗鼠标滚动和键盘事件,否则将其传递给浏览器?

    This one s been irking me for a while When I m using the mouse scroll wheel to scroll up and down in a webpage and a fla
  • 替换工作表名称中的多个无效字符[关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我正在写一个相当大的宏 最后使用用户之前输入的名称保存工作簿 我为此使用了工作表的标题 因此我需要删除任何会引发文件系统错误的保留字符 lt gt 我想避免使用大量Replace 语句 那
  • 动态分配文件名到Excel连接字符串

    这是我第一次在 SQL Server 2012 中使用 SSIS 我可以成功读取 excel 文件并将其内容加载到 SQL Server 2012 中的表中 任务是一个简单的直接读取 excel 文件 然后复制到 sql server 无需
  • 当屏幕方向改变时,可以转换先前视图控制器上的视图吗?

    我有一种情况viewControllerA pushes viewControllerB到导航堆栈上 当用户旋转屏幕和方向时viewControllerB改变 我想要一个subviewA of viewControllerA来转变和重新定位
  • 为什么这会产生 StackOverflow 错误?

    我最近开始使用 Haskell 并定义了这个看似简单的函数 f 0 1 f x x f x 1 然而 它的结果是这样的 GHCi version 8 2 1 http www haskell org ghc for help Prelude
  • 用于 MATLAB 的 Java JPA 类

    我在 Windows XP Pro SP3 上使用 MATLAB R2007b Java 1 6 SE Eclipse Helios 和 MySql 5 我正在尝试创建一个使用 JPA 注释访问 MySql 5 数据库的类库 这个想法是 M
  • 使用 PubSubclient 在 esp8266 和 arduino 之间进行 mqtt

    我正在使用 WiFiEsp 库将 ESP8266 与 arduino 结合使用 我想与 arduino 建立 MQTT 连接 所以我使用 PubSubclient 库 我收到错误 正在尝试 MQTT 连接 失败 rc 2 5 秒后重试 我的
  • 批量分割文本文件

    我有这个批处理文件来分割txt文件 echo off for f tokens 1 delims a in findstr n PASSWORD txt do for f delims c in b do gt text a txt ech
  • 使用异步方法等待 Task.Run 不会在正确的线程上引发异常

    当运行下面的测试方法时 我发现即使我等待一个抛出异常的任务 测试也会通过 此外 还会弹出一个单独的窗口 提示 QTAgent exe 已停止工作 这表明异常不会传播到运行测试的线程 而是杀死一个单独的线程 我想知道为什么会发生这种情况 另外
  • 在 Struts 2 中从 Java 获取 JSON 对象

    我正在尝试使用 Java 服务器获取响应文本getJSON jQuery 方法 虽然 当Java类是简单格式时我可以获得响应数据 String List and Map 使用其他Java对象时无法获取成功数据 以下是使用简单类型的 Java
  • PHP:file_get_contents 无法打开流:连接被拒绝

    我正在尝试访问第二台服务器file get contents和 simple load xml 我得到 无法打开流 连接被拒绝 结果会怎样呢 allow url fopen Yes allow url include Off 是我的 php
  • 在 Swift 中转换为不同的 C 结构不安全指针

    我想调用 Posix 套接字函数socket and bind来自斯威夫特 socket很容易 需要Int32s but bind造成了问题 因为我有一个sockaddr in指针 但它需要一个sockaddr指针 在 C 语言中 这将是一