Erlang端口示例

时间:2015-05-06 15:30:38

标签: c erlang

我实际上正在阅读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个字节。 这有道理吗?

1 个答案:

答案 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中)。