Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Unix的代码(big-endian)和linux上的相同代码(little-endian)创建不同的输出直径文件_C++_C_Ace_Diameter Protocol - Fatal编程技术网

C++ Unix的代码(big-endian)和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

我们有一个Unix代码,可以从.xml文件创建diameter文件作为输入。 当我们移动到Linux平台时,我们需要创建相同的实用程序,代码已成功编译,但实用程序未按预期创建输出文件内容,每个字节的位顺序都是颠倒的,我认为这是因为Linux是little endian

要写入输出文件的消息块的格式为:

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中是相同的。