月度归档:2011年09月

python socket发送二进制消息

    对于文本协议,就不多说了,Python是很好处理,但是当要传输二进制数据时,如果不熟悉的话,就达不到想要的效果了。如:要传输0b1000000011001100到服务器,转化为十六进制数据0x80cc,传到服务器后,就变成38306363这样的了。实际上是因为在传输时,是以字符串的形式传输的,因此值就变了。
    网络上大多数是建议用struct,我用了一下,如果我们的二进制数据变成十六进制的字符串是'80cc89a7' 这样的形式,如果使用struct感觉不是很方便,直接使用unhexlify把数据格式化一下,然后再传输,就可以了。
举例:

from binascii import hexlify, unhexlify
respmsg = '80cc00070000000081000001460200c83a02c0003b02c001510200014e0400000001'
respmsg = unhexlify(respmsg)
socket.sendto(respmsg, (remoteIP, int(remotePort)))

    这样发送到远端服务器的消息就是我们期望的二进制数据了。如果收到的是二进制数据,可以通过hexlify来格式化为80cc这样的形式的字符串。

drupal 分页无法显示的原因之一

drupal的分页方法,就是查询数据时,用pager_query($sql, $step, 0)代替db_query($sql),然后再调用theme(‘pager’, NULL, $step, 0)来产生分页,不过有的时候会发现theme(‘pager’, NULL, $step, 0)根本没有产生分页,可能导致这个问题的原因是pager_query参数不全造成的,可以给pager_query加上第4个参数来解决这个问题。如:

  $sql = ‘SELECT * from {drupal4you}  WHERE 1=1 ORDER BY {drupal4you}.nid DESC’;
  $countsql = ‘SELECT COUNT(*) from {drupal4you} WHERE 1=1’;
  $result = pager_query($sql, $step, 0, $countsql);

  $sec_list = array();
  while ($new = db_fetch_object($result)) {
    $sec_list[] = $new;
  }
  $pager = theme(‘pager’, NULL, $step, 0);