我实际上正在阅读Erlang中的互操作性教程C and Erlang: Erlang Port example我想知道c程序是如何工作的:
函数read_exact(byte * buf,int len)从stdin精确读取len字节并将它们放入buf中,但我不会动摇read_cmd做什么
read_cmd(byte *buf)
{
int len;
if (read_exact(buf, 2) != 2)
return(-1);
len = (buf[0] << 8) | buf[1];
return read_exact(buf, len);
}
尤其是这一行
len = (buf[0] << 8) | buf[1];
我们举一个例子: 如果我们运行程序并在输入中放入12,则以ASCII编码,因此buf [0] = 0x31和buf [1] = 0x32然后len = 0x3132,它等于十进制12549然后我们将len传递给read_exact,这意味着我们必须读取12549个字节。 这有道理吗?
答案 0 :(得分:0)
它读取&#34;数据包&#34;从一个字节流,其中&#34;包长度&#34;是16位(假设8位字符),将读取的字节填充到缓冲区(必须足够大以容纳读取字节)并返回实际读取的字节数。
首先,我们从流中读取两个字节(并将它们存储在buf [0]和buf [1]中)。
然后,len = (buf[0] << 8) | buf[1]
(与len = buf[0] * 256 + buf[1]
完全相同;由于左移8乘以256相同,左下8位为0,因此按位或者添加完成同样的事情)取两个字节长度前缀并将其转换为单个数字。
然后将其作为要读取的字节数传入(并填充到buf中)。