当前位置:  开发笔记 > 编程语言 > 正文

跨大型和小型Endian机器的数据传输

如何解决《跨大型和小型Endian机器的数据传输》经验,为你挑选了1个好方法。

假设有3个字符串,如"cat","bat,"rat".我需要将它们组合成一个字符串,并通过套接字编程将它们发送到另一台具有不同Endianess的计算机.

所以,如果另一台机器是大端,我将打包字符串:
memcpy (base, "cat", 3)
memcpy (base+3, "bat", 3)
memcpy (base+6, "rat", 3)

如果另一台机器是小端,我将把字符串打包为:
memcpy (base, "rat", 3)
memcpy (base+3, "bat", 3)
memcpy (base+6, "cat", 3)

我的方法是否正确?

其次,它们是否会以相反的顺序在另一台机器上实际接收?我的意思是当其他机器的软件开始从"基础"字符串中提取字符串时,它实际上是否会以相反的顺序 - 如鼠,蝙蝠,猫?



1> Joker_vD..:

将带有两个字节的内存缓冲区转储0x02 0x00到套接字中时,0x02首先发送,然后0x00发送.当接收器从套接字读取时,0x02将首先到达,并将存储在缓冲区的开头.0x00到达第二,并在之后存储0x02.所以,在你做了之后send(sock, &buffer, 2),接收者做recv(sock, &buffer, 2)了,你和接收者的内容buffer是相同的 - 在字节级别上.

但是现在出现了一个解释问题.是的,你有两个字节0x02 0x00,在内存中,但那又怎么样?他们的意思是什么?哦,他们是指0..65535范围内的整数,你说呢?但是有两种方法可以存储这样的数字.第一种是在第一个字节中存储更多有效位,因此512 = 10'00000000存储为0x02 0x00.第二种是在第一个字节中存储较少的有效位,因此512存储为0x00 0x02,而不是0x02 0x00存储的方式.2512

因此,重要的教训是:当您发送一些数据时,您必须确保接收器将像您一样解释它们.跨越多个字节的整数可以被不同地解释,因此您必须以某种方式就发送它们的一种方式达成协议.

现在,回到字符串.C中的字符串是概念和表示级别的字节序列 - 整数不是这样!当你使用整数时,我敢打赌你并不在乎它们被表示为一堆字节,并且实际的表示不是由C指定的.你的编译器可以以任何你想要的方式存储整数.但是,字符串按特定顺序的字节序列,并且在C中固定.您有第一个字符,第二个字符,依此类推.所以只有一种方法可以解释02 00为字符串:它是带有第一个字符的2个字符的字符串,0x02第二个字符0x00.没有混乱是可能的.

PS当然,当你开始认为字符串不是一个字节序列,而是一系列字符时,解释的问题又出现了:哪个字节意味着什么字符?但这是另一个故事.

编辑:在你对另一个答案的评论中,你说你"必须为其他机器做一个规定,知道我发送的实际上是一个整数而不是一个字符串".是.这是与其他机器交换数据的主要问题:您发送的内容和他们看到的内容只是一个字节序列.现在,这个交换的所有参与者必须以相同的方式解释这个字节序列,否则他们会感到困惑.如果你的意思是发送号码512并通过发送字节来做到这一点0x02 0x00,那么另一方更好地理解0x02 0x00你的意思,512而不是2,或者说START OF TEXT.或者当你发送给0x31 0x32 0x33 0x00你的意思是"123",而不是825373440,或者31323300.

仍然是原始问题的答案:"如果我发送"catbatrat",发件人会看到什么?" 是:"发件人将看到"catbatrat",独立于字节序".

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有