C++ Unix的代码(big-endian)和linux上的相同代码(little-endian)创建不同的输出直径文件
我们有一个Unix代码,可以从.xml文件创建diameter文件作为输入。 当我们移动到Linux平台时,我们需要创建相同的实用程序,代码已成功编译,但实用程序未按预期创建输出文件内容,每个字节的位顺序都是颠倒的,我认为这是因为Linux是little endian 要写入输出文件的消息块的格式为:C++ Unix的代码(big-endian)和linux上的相同代码(little-endian)创建不同的输出直径文件,c++,c,ace,diameter-protocol,C++,C,Ace,Diameter Protocol,我们有一个Unix代码,可以从.xml文件创建diameter文件作为输入。 当我们移动到Linux平台时,我们需要创建相同的实用程序,代码已成功编译,但实用程序未按预期创建输出文件内容,每个字节的位顺序都是颠倒的,我认为这是因为Linux是little endian 要写入输出文件的消息块的格式为: ACE_Message_Block* mb = m_pReqMsgBlock; while (mb) { out.write(mb->rd_ptr(), mb
ACE_Message_Block* mb = m_pReqMsgBlock;
while (mb) {
out.write(mb->rd_ptr(), mb->size());
mb = mb->cont();
}
有没有人能建议在代码中添加哪些额外内容,以便以预期的方式写入字节?您必须将大端格式转换为小端格式。对于结构中的16位和32位值,必须分别执行此操作 类似于
htons
和htonl
的函数可分别用于转换16位和32位整数
转换数字后,可以通过
write
功能写入 如果要将二进制数据写入文件,则该二进制数据的“正确”结尾是特定于机器的。因此,如果这些数据在另一个端点的机器上运行,则它们是不同的,这是正确的。您可能会在同一台Linux机器上使用另一个程序再次解析此二进制数据,这也会期望它是little endian
如果您希望输出是与endian无关的(例如,因为读取数据的程序位于big endian unix计算机上),则不应输出二进制数据。“Linux是little endian”-不,这是您的计算机!如果您的代码依赖于数据的特定表示,那么它就是写得不好。对位移位使用适当的序列化,不要依赖于实现特定的行为。尝试查看反转每个位是否有帮助。注意,只有在将文件传输到具有不同endianess的系统时才应执行此操作。以前的平台是什么?请指定您的实际输出和预期输出。
mb->rd_ptr()
返回什么类型?@dbush其ACE_消息块我已经尝试过了,但要写入的数据不是整数,它来自外部库,我们正在使用ACE类ACE_消息块。您需要查看ACE_消息块的结构元素,并一次转换每个元素,如上所示。请注意,8位值在big-endian和little-endian中是相同的。