如何正确将整数转换为二进制字符串?

3

我有一个问题:使用新的库(loom、ofs_handler、of_driver),我需要向交换机发送设置消息。我必须创建像这样的记录:

-record(ofp_field, {
          class = openflow_basic :: ofp_field_class(),
          name :: ofp_field_type(),
          has_mask = false :: boolean(),
          value :: bitstring(),
          mask :: bitstring()
         }).

但是'value'必须是一个二进制字符串,我不知道如何正确地将端口号(例如8080,6633)转换为二进制字符串,因为我可以使用<<Port>>, <<Port:32/integer>>并获得不同的结果。有人知道如何正确处理吗?
还是我必须使用binary:encode_unsigned

1个回答

5
在OpenFlow协议中,TCP和UDP端口号表示为16位整数(请参见1.4.0规范中的表12)。因此,您应该编写<<Port:16>>
OpenFlow始终使用大端整数(即网络字节顺序),这是如果未指定其他字节顺序,则Erlang生成的字节顺序,因此该代码将在任何平台上正确运行。(在C中,您需要在主机字节顺序和网络字节顺序之间进行转换。)有关如何使用不同的字节顺序,请参见Erlang参考手册中的"Bit Syntax Expressions"

谢谢你的回答,但如果它不能进行端口转换会怎么样?我有些困惑。 - Alexander Shavelev
定义openflow_basic_type()类型 :: in_port | in_phy_port| metadata| eth_dst| eth_src| eth_type| vlan_vid| vlan_pcp| ip_dscp| ip_ecn| ip_proto| ipv4_src| ipv4_dst| tcp_src| tcp_dst| udp_src| udp_dst| sctp_src|sctp_dst| ... - Alexander Shavelev
根据协议是TCP或UDP以及源端口还是目标端口,其中之一为 tcp_srctcp_dstudp_srcudp_dst - legoscia
或者你是指其他字段的长度吗?它在同一张表格中,长度为12。 - legoscia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接