【问题标题】:Erlang port exampleErlang 端口示例
【发布时间】:2015-07-16 20:30:20
【问题描述】:

我实际上正在阅读 Erlang C and Erlang: Erlang Port example 中的互操作性教程,我想知道 c 程序是如何工作的:

函数 read_exact(byte *buf, int len) 从标准输入准确读取 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 个字节。 这有意义吗?

【问题讨论】:

    标签: c erlang


    【解决方案1】:

    它从字节流中读取“数据包”,其中“数据包长度”为 16 位(假设为 8 位字符),将读取的字节填充到缓冲区中(该缓冲区必须足够大以容纳读取的字节) 并返回实际读取的字节数。

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

    然后,len = (buf[0] &lt;&lt; 8) | buf[1](碰巧,与len = buf[0] * 256 + buf[1] 完全相同;由于左移 8 与乘以 256 相同,将底部 8 位保留为 0,从而按位或加法完成同样的东西)采用两字节长度前缀并将其转换为单个数字。

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

    【讨论】:

    • 感谢 Vatine,但我认为读取字节流并将其填充到缓冲区中是由函数 read_exact 完成的,我真的不知道变量 len 在函数 read_cmd 中做了什么跨度>
    • @fedi 我试着更全面地解释一下,更好吗?
    • 谢谢,现在很清楚了。你知道有什么工具可以帮助我们可视化两个模块之间的数据流吗?
    猜你喜欢
    • 2015-07-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 2011-03-03
    • 2013-04-16
    • 2011-05-08
    • 2013-10-22
    相关资源
    最近更新 更多