在 Swift 中,如何将现有的二进制文件读入数组?

2024-04-16

作为我的项目的一部分,我有一个二进制数据文件,其中包含大量 32 位整数,我的一个类在初始化时读入该文件。在我的 C++ 库中,我使用以下初始化程序读入它:

Evaluator::Evaluator() {
    m_HandNumbers.resize(32487834);
    ifstream inputReader;

    inputReader.open("/path/to/file/7CHands.dat", ios::binary);

    int inputValue;
    for (int x = 0; x < 32487834; ++x) {
        inputReader.read((char *) &inputValue, sizeof (inputValue));
        m_HandNumbers[x] = inputValue;
    }
    inputReader.close();
};

在移植到 Swift 时,我决定将整个文件读入一个缓冲区(只有大约 130 MB),然后将字节复制出缓冲区。

所以,我做了以下事情:

public init() {
    var inputStream = NSInputStream(fileAtPath: "/path/to/file/7CHands.dat")!
    var inputBuffer = [UInt8](count: 32478734 * 4, repeatedValue: 0)
    inputStream.open()
    inputStream.read(&inputBuffer, maxLength: inputBuffer.count)
    inputStream.close()
}

它工作得很好,因为当我调试它时,我可以看到 inputBuffer 包含与我的十六进制编辑器所说的相同的字节数组。现在,我想有效地从那里获取这些数据。我知道它存储在..无论您称之为什么格式,其中最低有效字节在前(即数字 0x00011D4A 在文件中表示为“4A1D 0100”)。我很想手动迭代它并手动计算字节值,但我想知道是否有一种快速方法可以传递 [Int32] 数组并让它读取这些字节。我尝试使用 NSData,例如:

    let data = NSData(bytes: handNumbers, length: handNumbers.count * sizeof(Int32))
    data.getBytes(&inputBuffer, length: inputBuffer.count)

但这似乎没有加载值(所有值仍然为零)。谁能帮我将此字节数组转换为一些 Int32 值吗?更好的方法是将它们转换为 Int (即 64 位整数),以保持我的变量大小在整个项目中相同。


不确定你的字节序,但我使用以下函数。与您的代码的区别在于使用NSRanges实际所需的类型,而不是字节长度。该例程一次读取一个值(适用于内容因字段而异的 ESRI 文件),但应该很容易适应。

func getBigIntFromData(data: NSData, offset: Int) -> Int {
    var rng = NSRange(location: offset, length: 4)
    var i = [UInt32](count: 1, repeatedValue:0)

    data.getBytes(&i, range: rng)
    return Int(i[0].bigEndian)// return Int(i[0]) for littleEndian
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Swift 中,如何将现有的二进制文件读入数组? 的相关文章

随机推荐

  • 通过phpmailer批量发送邮件

    我正在使用 phpmailer 向我的订阅者发送批量电子邮件 但我面临一个可怕的问题 即当我向订阅者发送电子邮件时 每个订阅者都会多次收到相同的电子邮件 有些人获得了 4 次 有些人获得了 14 次 我正在通过 Mysql 表获取 flag
  • 如何确定用户在 JavaScript 中运行的是哪个版本的 IE?

    在一些现有代码中 有一个测试 通过检查对象 Browser Engine trident 是否已定义并返回 true 来查看用户是否正在运行 IE 但如何确定用户运行的是 IE6 或更早版本 还是 IE7 或更早版本 JavaScript
  • 如何在 MaterialButton 或 RaisingButton 上应用主题?

    有人可以帮助指出我们如何定义按钮的基本主题并在每个按钮上使用它吗 我到处寻找才发现textTheme但不是buttonTheme例子 Even on buttonTheme我们如何定义文本颜色 因为在按钮本身上我们可以直接这样做color
  • ASP.Net Core 从另一个控制器调用一个控制器

    在我的 ASP Net Core MVC 6 解决方案中 我有两组控制器 一组包含具有常规视图的网页 另一组包含 API 控制器 为了避免重复数据库逻辑 Web 控制器使用 API 控制器 目前 我正在通过将 DbContext 作为构造函
  • jQuery:多次淡入淡出div

    我在页面顶部有一个 div 我想淡入和淡出 3 次 我已经找到了一个问题 答案 它展示了如何通过将淡入淡出效果放入调用自身的函数中来进行无限循环淡入淡出 但我想知道指定有限数量的淡入淡出周期的最佳方法是什么 到目前为止 这就是我所拥有的 从
  • 资源调度问题

    我正在开发一个摩托车租赁网站 我遇到的问题是如何高效地解决为客人分配摩托车的问题 我知道如何以 愚蠢 的方式做到这一点 但我想知道是否有一种经典算法可以解决此类问题 这与将客人分配到酒店房间是同样的问题 在最后一个示例中 目标是通过不因调度
  • UIActionSheet 着色

    有人知道如何在 uikit 中为 uiactionsheet 着色吗 是的 因为它是一个 UIView 如 kmit 所描述的 您可以使用以下命令 addSubview 因此您可以添加自己的背景并使用 sendSubviewToBack 将
  • 在 JavaScript 中将字符串数组拆分为浮点数数组

    我正在尝试拆分一个称为 顶点 的字符串数组 并将其存储为浮点数组 目前字符串数组包含三个元素 0 1 0 1 1 0 1 1 0 我需要的是一个包含所有这些数字作为单独元素的浮点数组 0 1 0 1 1 0 1 1 0 我使用 split
  • 如何使用键盘快捷键打开弹出窗口? [复制]

    这个问题在这里已经有答案了 可能的重复 jQuery 的键盘快捷键 https stackoverflow com questions 593602 keyboard shortcuts with jquery 我想使用快捷键显示弹出窗口
  • 如何将自定义目标文件与 Haskell 库链接?

    我创建了一个 Haskell 包 它对 CUDA 代码中定义的函数进行 FFI 调用 我想在包构建期间将 cu 文件编译为对象 o 文件 并强制链接器将其链接 到目前为止 我尝试使用一种发现的技术这个问题 https stackoverfl
  • 使用plotly r 的多折线图

    我有一个数据框 我试图使用plotly作为多折线图来绘制它 下面是数据框的样子 Month considered pct x pct y pct
  • 如何阻止 VSCode 自动格式化删除括号内的空格?

    例如 当我写 foo bar 它将被格式化为 foo bar 我怎样才能让它保留2个空格 Edit 这是一个不同的问题如何更改 Visual Studio Code 中的缩进 https stackoverflow com question
  • 为什么在比较时将常量放在变量之前?

    我注意到我们的一些代码中存在以下语法有一段时间了 if NULL var or if 0 var 和类似的事情 有人可以解释一下为什么写这个的人选择这个符号而不是常见的符号var 0 way 这是风格问题 还是以某种方式影响性能 这是一种避
  • 为什么我在此语音识别代码中缺少 an4-1-1.match 文件?

    我在语音识别的解码部分遇到问题 我按照步骤操作here http www speech cs cmu edu sphinx tutorial html 当我输入 perl scripts pl decode slave pl 我收到这些错误
  • AWS从EBS切换到EFS

    我正在考虑从 AWS Elastic Block Storage 切换到 AWS Elastic Filesystem 主要是为了易于扩展 而且可共享存储似乎也不错 目前我有一个 debian EC2 实例和一个 EBS 卷 将数据从 EB
  • Python 中丢弃图像时出现内存泄漏

    我目前正在用 Python 编写一个简单的棋盘游戏 我刚刚意识到当图像重新加载时 垃圾收集不会从内存中清除丢弃的位图数据 仅当游戏启动或加载或分辨率更改时才会发生这种情况 但它会增加消耗的内存 所以我不能让这个问题得到解决 重新加载图像时
  • 什么是IDL?

    IDL 是什么意思 我用谷歌搜索了一下 发现它代表接口定义语言 用于组件的接口定义 但是 在实践中 IDL 的目的是什么 微软使用它吗 接口定义语言 IDL 用于在远程过程调用 RPC 中建立客户端和服务器之间的通信 它有很多变体 例如 S
  • batik-rasterizer.jar - 将 svg 转换为 png

    我尝试使用以下命令在我的 Linux 服务器中设置导出服务器 以将图形下载为图像高图表 http www highcharts com docs export module setting up the server command jav
  • 单击p-dialog关闭(X)按钮时如何调用角度函数?

    单击p dialog关闭 X 按钮时如何调用角度函数 我已经搜索并尝试过这个 onHide cancel 但这不起作用 请分享您的解决方案 我知道我们可以使用close cancel按钮隐藏弹出窗口 但在我的场景中 我想在单击 X 按钮单击
  • 在 Swift 中,如何将现有的二进制文件读入数组?

    作为我的项目的一部分 我有一个二进制数据文件 其中包含大量 32 位整数 我的一个类在初始化时读入该文件 在我的 C 库中 我使用以下初始化程序读入它 Evaluator Evaluator m HandNumbers resize 324