【发布时间】: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来实现的,并且代码已经处于完成阶段。
我有两件事要问。
如果我需要去除输出代码中不必要的零六进制怎么办? 目前,我们正在使用硬编码方法来跳过所有无符号长和有符号长变量。
应该解决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 中运行(
long和int相同),那么它应该可以很好地使用更正为int的类型。 -
...但是您还应该正确序列化结构,而不仅仅是输出其内部表示。
-
@HarryJohnston 这意味着如果我不能改变结构,我需要跳过带有硬线的位到输出代码进行序列化。我说的对吗?.....
-
您根本不应该使用这些位。将结构中的每个字段视为一个字段,例如,打印 Ul 的值,然后打印 a 的值,然后打印 Sl 的值。但是,您还需要考虑当 Linux 版本的结构包含 不能包含在 Windows 版本的结构中的数据时,您会做什么。
-
@HarryJohnston 谢谢你的回答。我明白你的意思。那么有什么更好的方法来排除该字段?