Python将IP字符串打包为字节

时间:2017-01-15 17:27:54

标签: python ip-address pack unpack inet-aton

我想实现我自己的<b>Text</b> and more text 特定函数来将IP字符串(即“192.168.0.1”)打包到32位打包值,而不使用struct.pack内置方法

我到目前为止:

socket.inet_aton

我的问题是: 如何从ip = "192.168.0.1" hex_list = map(hex, map(int, ip.split('.'))) # hex list now is : ['0xc0', '0xa8', '0x0', '0x01'] 转到['0xc0', '0xa8', '0x0', '0x01'],(这是我从'\xc0\xa8\x00\x01'获得的内容?

并且 - 如何在该字符串的中间有一个NUL(socket.inet_aton(ip))?我想我对\x00缺乏了解格式)

3 个答案:

答案 0 :(得分:2)

您可以根据需要使用字符串理解进行格式化:

ip = "192.168.0.1"
hex_list = map(int, ip.split('.'))
hex_string = ''.join(['\\x%02x' % x for x in hex_list])

或作为一个班轮:

hex_string = ''.join(['\\x%02x' % int(x) for x in ip.split('.')])

答案 1 :(得分:0)

替代方案:

您可以使用ipaddressto_bytes (python 3.2)吗?

>>> import ipaddress
>>> address = ipaddress.IPv4Address('192.168.0.1')
>>> address_as_int = int(address)
>>> address_as_int.to_bytes(4, byteorder='big')
b'\xc0\xa8\x00\x01'

请注意,您实际上可能只需要整数。

显然可以更短,但想要清楚地显示所有步骤:)

答案 2 :(得分:0)

基于@Stephen的回答,但返回的是实际字节数的字符串,而不是带文字斜杠的字符串:

class PersonList extends React.Component {
  constructor(props) {
    super(props);
    this.handleMouseEnter = this.handleMouseEnter.bind(this);
    this.handleMouseLeave = this.handleMouseLeave.bind(this);
  }

  handleMouseEnter() {
    alert(patients[???].phone});
  }
  handleMouseLeave() {

  }

  render() {

    let list = patients.map((patients, p) =>
     <tr  onMouseEnter={this.handleMouseEnter}
          onMouseLeave={this.handleMouseLeave}
          key={'patient_' + p}>{patients.name}</tr>)

    return(
      <div className="list">
        <table>
          {list}
        </table>
      </div>
    );
  }
}

在Python 2和3中工作。返回def pack_ip(ip): num_list = map(int, ip.split('.')) return bytearray(num_list) src_ip = pack_ip('127.0.0.255') print(repr(src_ip)) 而不是字符串,与Python3的最佳做法匹配。