假设有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)
我的方法是否正确?
其次,它们是否会以相反的顺序在另一台机器上实际接收?我的意思是当其他机器的软件开始从"基础"字符串中提取字符串时,它实际上是否会以相反的顺序 - 如鼠,蝙蝠,猫?
将带有两个字节的内存缓冲区转储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
存储的方式.2
512
因此,重要的教训是:当您发送一些数据时,您必须确保接收器将像您一样解释它们.跨越多个字节的整数可以被不同地解释,因此您必须以某种方式就发送它们的一种方式达成协议.
现在,回到字符串.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"
,独立于字节序".