处理字节顺序和文件的最常见方法 C++

2023-12-11

我一开始只是使用字符读取/写入 8 位整数到文件。不久之后,我意识到我需要能够处理的可能值不仅仅是 256 个。我对如何读取/写入 16 位整数到文件进行了一些研究,并了解了大端和小端的概念。我做了更多的研究,发现了一些不同的方法来处理字节序,并且我还学习了一些编写与字节序无关的代码的方法。我的总体结论是,我必须首先检查我使用的系统是否使用大尾数法或小尾数法,根据系统使用的类型更改尾数法,然后使用这些值。

我找不到的一件事是最好/最常见在 C++ 中读取/写入文件时处理字节顺序的方法(无网络)。那么我应该如何去做呢?为了帮助澄清,我询问在大端系统和小端系统之间读取/写入 16/32 位整数到文件的最佳方法。因为我担心不同系统之间的字节顺序,所以我也想要一个跨平台的解决方案。


最常见的方法是在将内存中的值写入文件之前通过 htons() 或 htonl() 传递它们,并在从文件读回读取的数据后通过 ntohs() 或 ntohl() 传递读取的数据。 (htons()/ntohs() 处理 16 位值,htonl()/ntohl() 处理 32 位值)

当针对大端 CPU 进行编译时,这些函数是无操作的(它们只是逐字返回您传递给它们的值),因此这些值将以大端格式写入文件。当针对小端 CPU 进行编译时,这些函数会交换传入值并返回交换后的版本,因此这些值将以大端格式写入文件。

这样,文件中的值始终以大端格式存储,并且在与内存之间传输时,它们始终会转换为适当的(CPU 原生)格式。这是最简单的方法(因为您不必编写或调试任何条件逻辑),也是最常见的方法(这些函数在几乎所有平台上实现并可用)

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

处理字节顺序和文件的最常见方法 C++ 的相关文章

  • 与 for_each 或 std::transform 一起使用时,如何调用 C++ 函子构造函数

    我以前从未使用过 C 函子 所以我只是想了解它们是如何工作的 例如假设我们有这个函子类 class MultiplyBy private int factor public MultiplyBy int x factor x int ope
  • 使用 ADAL v3 使用 ClientID 对 Dynamics 365 进行身份验证

    我正在尝试对我们的在线 Dynamics CRM 进行身份验证以使用可用的 API 我能找到的唯一关于执行此操作的官方文档是 https learn microsoft com en us dynamics365 customer enga
  • 是否可以使用 http url 作为 DirectShow .Net 中源过滤器的源位置?

    我正在使用 DirectShow Net 库创建一个过滤器图 该过滤器图通过使用 http 地址和 WM Asf Writer 来流式传输视频 然后 在网页上 我可以使用对象元素在 Windows Media Player 对象中呈现视频源
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • 在哪里可以找到 Microsoft.Build.Utilities.v3.5

    如何获取 Microsoft Build Utilities v3 5 我正在使用 StyleCop 4 7 Stylecop dll 中的 StyleCop msbuild 任务似乎依赖于 Microsoft Build Utilitie
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • 让 Flexbox 中的图像填充所有垂直空间并保持完全可见

    我需要在 div 左侧放置一个图像 并放置该图像 与 div 高度相同 其本身具有非固定的 与内容相关的高度 完全可见 保持其纵横比 Flexbox 似乎非常适合这项工作 但当将图像设置为 100 高度时 其尺寸保留自然宽度 内容会溢出到
  • centos 8,firewalld 错误`COMMAND_FAILED:'python-nftables'失败`[关闭]

    Closed 这个问题是与编程或软件开发无关 目前不接受答案 当我尝试重新加载firewalld时 它告诉我 Error COMMAND FAILED python nftables failed internal 0 0 0 Error
  • appendChild 仅在第一次有效

    我想通过同一页面上的按钮和事件处理程序将相同的内容重复附加到元素 我遇到的问题是它只能在第一次使用 它第一次完全按照我想要的方式执行 然后在后续按下按钮时无法执行任何操作 我查了一下 似乎在第一个追加之后 newstuff innerHTM
  • 将 3D 模型安装在窗口内

    我想显示适合视图的不同尺寸的模型 以便整个模型在屏幕内可见 最好的方法是什么 我尝试使用此公式缩放 使用 glScale 模型 scaleFactor screenSize maxModelSize constant 其中尺寸是高度或宽度
  • 隐藏 Woocommerce 中特定用户角色的特定运输方式

    在 Woocommerce 中 我使用的是 WooCommerce Wholesale Pro Suite 来自IgniteWoo 以及统一费率盒子运输插件 将 B2B 添加到我们的网上商店 我正在尝试禁用特定用户角色 客人和客户的统一费率
  • Rails map.resources 与 has_many :through 不起作用?

    我有三个 相关的 模型 指定如下 class User lt ActiveRecord Base has many posts has many comments has many comments received through gt
  • .NET Maui - 重置 TabBar 项目单击上的导航

    我目前正在使用 NET Maui 想知道选项卡内的导航是如何工作的 我在文档中找不到我要找的内容 但如果我错过了 也许有人可以为我指出 所以目前我有一个带有两个底部选项卡的选项卡栏 第二个选项卡显示项目列表 当我单击一个项目时 我想显示一个
  • 使用 jq 将 JSON 转换为 CSV

    我有一个 json 文件 它存储在环境变量 temp 中 users username jack email email protected total running apps 1 api mock app 0 flogo 1 ipaas
  • Java 约定:在类中使用 getter/setter?

    我的教授非常强调通过始终使用访问器和修改器来访问私有实例变量来防止隐私泄露 但是 我是否必须在类中使用类的 getter setter 方法 举例来说 如果我有以下课程 public class Person private String
  • 使用 Anaconda 在 Google App Engine 上安装软件包?

    这个周末我制作了一个 Flask 应用程序 它使用了很多 ML 包 比如 Pytorch 模型都已经构建好了 所以我们不需要像 Google Compute Engine 这样疯狂的东西 但是 我仍然需要安装这些库 然而 其中许多 例如 P
  • 使用executeOnExecuter可以并行执行多少个?

    在我的应用程序中 当用户点击列表中的文档时 我需要提供文档的下载功能 因此 对于多个活动线程 AsyncTask 进入了我的脑海 但我也注意到人们并没有推荐 AsyncTask 来进行这种操作 因为在这种情况下大号没有 线程将在点击文档时开
  • @EnableMongoAuditing for MongoDB on Cloud Foundry / mongolab

    我的设置在本地有效 但在将其部署到 CloudFoundry mongolab 时无效 配置非常类似于docs 我本地的 spring 配置 Configuration Profile dev EnableMongoAuditing Ena
  • 这段 JavaScript 代码 getElementById 有什么问题吗?

    我下面有这个代码 div This is an example div 为什么它不起作用 该脚本在具有给定 id 的元素存在之前运行 并且您有一个DOM 属性名称其中有一个连字符 被视为减号运算符 div This is an exampl
  • 在express中全局重定向所有尾随斜杠

    我正在使用 Node js 和 Express 并且有以下路由 app get function req res locals date new Date toLocaleDateString res render home ejs loc
  • 一次不能多次借用“x”作为可变的

    在下面的代码中 操场 struct Node datum static str edges Vec
  • 从日期时间熊猫中提取季节

    我正在尝试从带有日期时间列的大型数据框中提取季节 这是我使用过的代码 def season of date date UTC year str date UTC year seasons spring pd date range start
  • ConcurrentModificationException 仅在 Java 1.8.0_45 中

    我对这段代码有两个问题 import java util public class TestClass private static List
  • JNI无法释放内存

    这是 JNI 的 C 代码 extern C JNIEXPORT jbyteArray JNICALL Java cn rilled encoder JNIEncoder encodeEncryptBuff JNIEnv env jobje
  • preg_split 逗号不在括号内

    测试字符串 Organic whole wheat bread Monterey Jack Cheese milk cheese culture salt Hormel Natural Ham salt turbinado sugar la
  • 处理字节顺序和文件的最常见方法 C++

    我一开始只是使用字符读取 写入 8 位整数到文件 不久之后 我意识到我需要能够处理的可能值不仅仅是 256 个 我对如何读取 写入 16 位整数到文件进行了一些研究 并了解了大端和小端的概念 我做了更多的研究 发现了一些不同的方法来处理字节