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 中)。
我实际上正在阅读 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 中)。