Erlang 端口示例

Erlang port example

我实际上正在阅读 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 放入输入 12 以 ASCII 编码,因此 buf[0]=0x31 和 buf[1]=0x32 然后 len =0x3132 等于十进制的 12549 然后我们将 len 传递给 read_exact,也就是说我们要读取12549字节。 这有意义吗?

它从字节流中读取一个 "packet",其中 "packet length" 是 16 位(假设是 8 位字符),将读取的字节填充到缓冲区(必须足够大以容纳读取的字节数)和 returns 实际读取的字节数。

首先,我们从流中读取两个字节(并将它们存储在 buf[0] 和 buf[1] 中)。

然后,len = (buf[0] << 8) | buf[1](正好和len = buf[0] * 256 + buf[1]一模一样;由于左移8等于乘以256,低8位为0,由此按位或加法完成相同的事情)采用两个字节长度的前缀并将其转换为单个数字。

然后将其作为要读取的字节数传入(并填充到 buf 中)。