【问题标题】:compatibility and structure padding兼容性和结构填充
【发布时间】:2017-05-22 01:40:00
【问题描述】:

Linux (64bit OS) 中只有一种结构 我做了以下操作以将此结构输出为 Hexa 代码。

在下面的代码之后,“strBuff”会像“printf”一样输出到文件中, 这是需要从windows读取的情况,应该和上面的“example”一样的结构存储。 但是,这里有一个问题。 在我当前的窗口中,unsigned long 大小为 4 字节。 在我当前的 Linux 中,unsigned long 大小为 8 字节。

所以输出文本中的零输出太多了。 这似乎与填充位有关。预计只有2个字节应该被填充,填充是由4个字节完成的。 无法更改结构“example”,因为代码是从linux输出时认为它是4byte来实现的,并且代码已经处于完成阶段。

我有两件事要问。

  1. 如果我需要去除输出代码中不必要的零六进制怎么办? 目前,我们正在使用硬编码方法来跳过所有无符号长和有符号长变量。

  2. 应该解决windows和linux的兼容性问题。

可以在读取端和输出端更改代码。有没有与上述问题和兼容性相关的lib可以解决padding问题?

enter code here

struct example
{
unsigned long Ul; 
int a;
signed long Sl;
}

struct examle eg;

// data input at eg

char *tempDataPtr = (char*)(&eg);

for(int i = 0 ; i < size(example) ; i++)
{
sprintf(&strBuff[i*3],"%02X ", tempDataPtr[i]);
}

【问题讨论】:

  • 你不改变结构只会给自己制造麻烦。如果代码已经在 Windows 中运行(longint 相同),那么它应该可以很好地使用更正为 int 的类型。
  • ...但是您还应该正确序列化结构,而不仅仅是输出其内部表示。
  • @HarryJohnston 这意味着如果我不能改变结构,我需要跳过带有硬线的位到输出代码进行序列化。我说的对吗?.....
  • 您根本不应该使用这些位。将结构中的每个字段视为一个字段,例如,打印 Ul 的值,然后打印 a 的值,然后打印 Sl 的值。但是,您还需要考虑当 Linux 版本的结构包含 不能包含在 Windows 版本的结构中的数据时,您会做什么。
  • @HarryJohnston 谢谢你的回答。我明白你的意思。那么有什么更好的方法来排除该字段?

标签: c++ c linux windows


【解决方案1】:

使用具有明确格式的类型: (并将它们从大到小排序,以防止字段之间的填充差异)

struct example
{
    uint32_t Ul;
    int32_t Sl;
    int16_t a;
}

【讨论】:

  • 感谢您的回答。我是一名无法修改结构的新员工。格式已经设置好了,我不能修改。我很难过。
  • 我什至不能改变结构变量的顺序。 - _-;
  • 啊。从无法更改的结构中复制到临时的良好结构(在阅读方面反之亦然)怎么样?
  • 您在问题中说“代码可以更改”,但在这里您说不能。如果您需要跨编译器和平台的可移植性,您不想直接序列化结构来执行此操作。
  • @Joe 我首先为混乱道歉。读写代码只有两个地方,我不能改变结构。
猜你喜欢
  • 2012-02-22
  • 2012-01-31
  • 2015-09-30
  • 1970-01-01
  • 2015-09-04
  • 2015-03-06
  • 2011-08-13
  • 1970-01-01
相关资源
最近更新 更多