如何消除结构体数据成员之间的填充字节

2023-12-01

我有一个带有“消息”的二进制文件,我试图使用结构将字节放入正确的变量中。在我的示例中,我使用了两种类型的消息:Tmessage 和 Amessage。

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string>
#include <iomanip>

using namespace std;

struct Tmessage
{
    unsigned short int Length;
    char MessageType;
    unsigned int Second;
};

struct Amessage
{
    unsigned short int Length;
    char MessageType;
    unsigned int Timestamp;
    unsigned long long int OrderReferenceNumber;
    char BuySellIndicator;
    unsigned int Shares;
    char Stock[6];
    unsigned int Price;
};

int main(int argc, char* argv[])
{
    const char* filename = argv[1];
    fstream file(filename, ios::in | ios::binary);
    unsigned long long int pi = 0;

    if(file.is_open()){ cout << filename << " OPENED" << endl; }
    else { cout << "FILE NOT OPENED" << endl; }

    unsigned char* memblock;
    memblock = new unsigned char[128];
    file.read((char *)memblock, 128);

    cout <<  "BINARY DATA" << endl;
    while (pi < 128)
    {
        cout << setw(2) << hex << static_cast<unsigned int>(memblock[pi]) << " ";
        pi++;
        if((pi%16)==0) cout << endl;
    }

    unsigned int poi = 0;

    Tmessage *Trecord;
    Trecord = (Tmessage *)memblock;
    cout << "Length: " << hex << (*Trecord).Length << endl;
    cout << "Message type: " << hex << (*Trecord).MessageType << endl;
    cout << "Second: " << hex << (*Trecord).Second << endl;

    poi = poi + 7; cout << endl;

    Amessage *Arecord;
    Arecord = (Amessage *)(memblock+poi);
    cout << "Length: " << hex << (*Arecord).Length << endl;
    cout << "Message type: " << hex << (*Arecord).MessageType << endl;
    cout << "Timestamp: " << hex << (*Arecord).Timestamp << endl;
    cout << "OrderReferenceNumber: " << hex << (*Arecord).OrderReferenceNumber << endl;
    cout << "BuySellIndicator: " << hex << (*Arecord).BuySellIndicator << endl;
    cout << "Shares: " << hex << (*Arecord).Shares << endl;
    cout << "Stock: " << hex << (*Arecord).Stock << endl;
    cout << "Price: " << hex << (*Arecord).Price << endl;

    delete memblock;
    file.close();
    cout << endl << "THE END" << endl;
    return 0;
}

我运行程序时的输出:

stream OPENED
BINARY DATA
 0  5 54  0  0 62 72  0 1c 41  0  f 42 40  0  0 
 0  0  0  4 2f 76 53  0  0  3 e8 53 50 59 20 20 
20  0 11  5 d0  0 1c 41  0  f 42 40  0  0  0  0 
 0  4 2f 78 42  0  0  3 e8 53 50 59 20 20 20  0 
10 f7 5c  0 1c 41  0  f 42 40  0  0  0  0  0  4 
2f 90 53  0  0  1 2c 53 50 59 20 20 20  0 11  2 
b0  0  5 54  0  0 62 76  0  d 44 14 25 78 80  0 
 0  0  0  0  4 2f 90  0  d 44 14 25 78 80  0  0 
Length: 500
Message type: T
Second: 726200

Length: 1c00
Message type: A
Timestamp: 40420f
OrderReferenceNumber: 53762f0400000000
BuySellIndicator: 
Shares: 20595053
Stock:   
Price: 420f0041

THE END

程序将字节正确放置在 Tmessage 结构中。 (0 5 54 0 0 62 72)
然而,解析消息时发生了一些事情。
(0 1c 41 0 f 42 40 0 0 0 0 0 4 2f 76 53 0 0 3 e8 53 50 59 20 20 20 0 11 5 d0)

Lenght、MessageType 和 Timestamp 是正确的,但 OrderReferenceNumber 包含属于 BuySellIndicator 的“53”字节,然后其他变量不正确。

正确的A消息输出应该是:
长度:1c 0
消息类型:41
时间戳:40 42 f 0
订单参考编号:76 2f 4 0 0 0 0 0
买入卖出指标:53
分享: e8 3 0 0
库存: 53 50 59 20 20 20
价格:d0 5 11 0

2个问题: a) 为什么OrderReferenceNumber 包含“53”字节? b) 我认为“char Stock[6]”不起作用,因为 Share 的字节和 Price 的字节之间有超过 6 个字节。如何将 6 个字节放入 char 向量或字符串中?

注意:我知道我必须交换字节,因为二进制数据采用大端字节序。这就是为什么“股票”不应该被交换。 非常感谢您的帮助!亲切的问候,


结构体的数据成员之间可能存在未命名的填充字节。

为了以可移植的方式从文件中读取二进制数据,您应该单独读取结构体的每个成员。

您还应该使用中指定的确切宽度类型<cstdint>(如果你的标准库还没有这个头文件,Boost 有一个实现);这将允许您确保数据成员的大小与消息中字段的大小相匹配。

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

如何消除结构体数据成员之间的填充字节 的相关文章

  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 使用 C# 读取 Soap 消息

  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler
  • 当我使用 OpenSSL1.1.0g 根据固定的 p 和 g 值创建 Diffie Hellman 密钥协议密钥时,应该执行哪些检查?

    您好 我尝试通过这段代码使用修复 p 和 g 参数来制作 Diffie Hellman Keysanswer https stackoverflow com a 54538811 4706711 include

随机推荐

  • SignalR 在 Chrome 上使用服务器发送的事件

    我的问题 我正在 Chrome 上运行我的代码 请注意 SignalR 使用的是 html5server sent events作为自动选择 太棒了 然而 当我刷新页面时onDisconnect 服务器端直到 30 秒后才会触发 里面有没有
  • Objective-C 使用动态绑定,但如何实现呢?

    我知道 Objective C 对所有方法调用都使用动态绑定 这是如何实施的 Objective c 是否在编译前 转换为 C 代码 并仅使用 void 指针来处理所有内容 从概念上讲 发生的事情是有一个调度程序库 通常称为 Objecti
  • 创建新的 Backbone 视图时如何知道元素是否已经在 DOM 中

    情况是这样的 当页面第一次打开时 服务器 php 已经准备好了DOM 如果用户打开了 javascript 那么我想将我的页面转换为网络应用程序 或任何你所说的 一旦 Javascript 初始化 Backbone 就会从服务器获取集合 问
  • 具有动态 ID 的 VBA getElementById

    我一直在搜索整个论坛 msdn 和专业教程 但找不到 VBA 的答案 我怎样才能使getElementById在访问 VBA 模块中工作 其中要查找的 id 是动态的 我们看一下html代码 div div class contactsCa
  • 用正确的整数类型替换数组访问变量

    我有使用 int 访问数组的习惯 尤其是在 for 循环中 然而我最近发现我可能一直 做错了 而且我的 x86 系统一直向我隐瞒真相 事实证明 int 没问题sizeof size t sizeof int 但当在系统上使用时sizeof
  • 将字节数组插入 SQL Server

    我正在构建一个sql insert string用于Microsoft ApplicationBlocks Data SqlHelper使用方法如下 SqlHelper ExecuteNonQuery Transaction Command
  • #ref:空手道工具中的 java.util.LinkedHashMap 错误

    def template1 name1 value1 name2 value2 def template2 template1 Def jsontemplate json1 template1 json2 template2 Print j
  • 打印 HttpParams / HttpUriRequest 的内容?

    我有一个HttpUri请求例如 有没有办法打印它包含的所有参数 例如 我几乎可以得到它们 HttpUriRequest req HttpParams params req getParams for int i 0 i lt params
  • Swift:如何找到 UILabel 中字母的位置(x,y)?

    我试图找到 labelText 中字母的位置 Objective C 中的代码是 NSRange range Good Morning rangeOfString NSString prefix Good Morning substring
  • 使用razor引擎在mvc4中重写url

    我想重写以下网址 http localhost 99 Product CategoryLevel CategoryId 65 ProductName Vitamins with http localhost 99 Product Vitam
  • 我的 imageIcon 不起作用?

    我正在尝试设置 JFrame imageIcon 但由于某种原因它没有显示在 JFrame 中 ImageIcon img new ImageIcon stop jpg frame setIconImage img getImage 我创建
  • 比较 dd/mm/yyyy 格式的 2 个日期的最短方法

    谁能建议进行这种比较的最巧妙的方法 我需要测试以 dd mm yyyy 格式提供的日期是否小于固定日期 例如 01 05 2009 我知道我可以使用 strtotime 将它们转换为 unix 时间格式 然后进行比较 但我 我很好奇是否有更
  • 将 bean 自动装配到 JSF 托管 bean 时为空指针

    我使用 Spring Java 邮件和 Velocity 模板开发了一个电子邮件服务 如下所示 电子邮件 java Component public class Email private JavaMailSender mailSender
  • 1.Javascript中的toString()语法错误

    为什么下面的第一行给出错误 而第二行和第三行工作正常 1 toString SyntaxError 1 toString OK 1 toString OK The 存在歧义 它是小数还是属性访问器 解释器将其视为十进制 因此您可以使用 允许
  • 使用 javascript 压缩所有表单数据

    我想压缩一个包含超过 1000 个变量的巨大 HTML 表单中的所有数据 以规避 5 3 9 之前的 PHP 版本中的 max input vars 限制 如何使用 javascript 读取 HTML 表单中的所有数据 将其序列化 或创建
  • 从命令行编译 CUDA 代码

    我正在尝试使用以下语法从命令行编译 CUDA 代码 nvcc c MyFile cu ccbin C Program Files x86 Microsoft Visual Studio 10 0 VC bin 我安装了 CUDA Toolk
  • 如何在cakephp中循环创建pdf文件?

    我已经实现了pdf创建 http bakery cakephp org articles kalileo 2010 06 08 creating pdf files with cakephp and tcpdf 但按照我的逻辑 有一个链接
  • 从tinyMCE中的插入符位置删除x个字符

    我正在开发一个项目 用户可以输入特殊字符 然后按 Tab 键自动完成值 这部分大部分工作正常 但我希望能够从插入符位置之前删除 x 个字符 例如 如果 是插入符号 我有以下文本 chr 我希望能够删除光标位置之前的 3 个字符 例如我最终会
  • 使用 flags() 创建一个 QTableWidgetItem

    我不明白 QTableWidgetItem Chapter 中的 Qt5 文档 我无法获得正确的参数来将新创建的表格单元设置为可编辑 我有这段代码 for i item in enumerate event desc start 0 pri
  • 如何消除结构体数据成员之间的填充字节

    我有一个带有 消息 的二进制文件 我试图使用结构将字节放入正确的变量中 在我的示例中 我使用了两种类型的消息 Tmessage 和 Amessage include