当您将包含两个字节的内存缓冲区转储0x02 0x00
到套接字中时,0x02
首先发送,然后0x00
发送。当接收者从套接字读取时,0x02
将首先到达,并将存储在缓冲区的开头。0x00
第二个到达,并在 之后立即存储0x02
。所以,在你做了之后send(sock, &buffer, 2)
,接收者做recv(sock, &buffer, 2)
了,你的和接收者的buffer
s 的内容是相同的——在字节级别上。
但是现在出现了一个解释问题。是的,你有两个字节,0x02 0x00
, 在内存中,但那又怎样?他们的意思是什么?哦,他们的意思是范围内的整数0..65535
,你说?但是有两种方法可以存储这样的数字。第一种是在第一个字节中存储更多有效位,因此512 = 10'00000000
存储为0x02 0x00
. 第二种是在第一个字节中存储较低的有效位,因此512
存储为0x00 0x02
, 并且是存储, not0x02 0x00
的一种方式。2
512
所以,重要的教训是:当你发送一些数据时,你必须确保接收者会像你一样解释它们。跨越多个字节的整数可以有不同的解释,因此您必须以某种方式就发送它们的确切方式达成一致。
现在,回到字符串。C 中的字符串是概念和表示级别的字节序列——整数不是这样!当你使用整数时,我敢打赌你不会很在意它们被表示为一堆字节,而实际的表示不是由 C 指定的。你的编译器可以以它想要的任何方式存储整数。然而,字符串是按一定顺序排列的字节序列,这在 C 中是固定的。你有第一个字符,第二个字符,依此类推。所以只有一种解释02 00
为字符串的方法:它是一个包含第一个字符0x02
和第二个字符的 2 个字符的字符串0x00
。没有混淆是可能的。
PS 当然,当你开始考虑字符串不是字节序列,而是字符序列时,解释的问题又出现了:哪个字节意味着什么字符?但那是另一回事了。
编辑:在你对另一个答案的评论中,你说你“必须为另一台机器做准备,以知道我发送的实际上是一个整数而不是一个字符串”。是的。这是与其他机器交换数据的主要问题:你发送的和他们看到的只是一个字节序列。现在这个交换的所有参与者都必须以相同的方式解释这个字节序列,否则他们会感到困惑。如果您的意思是发送数字512
并通过发送字节来执行此操作0x02 0x00
,那么另一方会更好地理解0x02 0x00
您的意思是512
而不是2
,或者说START OF TEXT
。或者,当你发送0x31 0x32 0x33 0x00
你的意思是"123"
,而不是825373440
,或者31323300
。
不过,原始问题的答案是:“如果我发送"catbatrat"
,发件人会看到什么?” 是:“发件人将看到"catbatrat"
,独立于字节序”。