月度归档:2012年10月

【转】Python 十六进制与浮点数互相转换

在python中虽然很少用到十六进制或者二进制数据,但是当要处理这些数据时,
进制的转换还是必要的,这里把找到的浮点数转换为十六进制,十六进制转换为浮点数
的方法分享出来。有了十六进制数据,二进制也好,十进制,八进制也好,都很方便转换了。

1. 浮点数转为十六进制数据

>>> struct.pack("<f", 238.3).encode('hex')
'cd4c6e43'

2. 十六进制数转为浮点数

>>> import struct
>>> struct.unpack('!f', '41973333'.decode('hex'))[0]
18.899999618530273
>>> struct.unpack('!f', '41995C29'.decode('hex'))[0]
19.170000076293945
>>> struct.unpack('!f', '470FC614'.decode('hex'))[0]
36806.078125

或者

from ctypes import *

def convert(s):
    i = int(s, 16)                   # convert from hex to a Python int
    cp = pointer(c_int(i))           # make this into a c integer
    fp = cast(cp, POINTER(c_float))  # cast the int pointer to a float pointer
    return fp.contents.value         # dereference the pointer, get the float

print convert("41973333")    # returns 1.88999996185302734375E1

print convert("41995C29")    # returns 1.91700000762939453125E1

print convert("470FC614")    # returns 3.6806078125E4

转自:http://stackoverflow.com/questions/1592158/convert-hex-to-float?answertab=votes#tab-top
 
     http://stackoverflow.com/questions/10981661/float-number-to-inverse-order-hex?answertab=votes#tab-top

Drupal 模块中扩展文章表单(node)

第一步:扩展node表单。扩展字段需要单独建表来保存扩展字段。
参考:http://api.drupal.org/api/drupal/modules%21node%21node.api.php/function/hook_form/7

/**
 * Implements hook_form().
 */
function mymodule_form($node, $form_state) {

  $form = node_content_form($node, $form_state);
  $form['my_description'] = array(
      '#clear' => TRUE,
      '#type' => 'textarea',
      '#resizable' => FALSE,
      '#default_value' => isset($node->nid) ? $node->myd_description : '',
      '#attributes' => array('class' => array('project-summary'), 'rows' => '5', 'cols' => '10'),
    );

  $form['#theme'] = 'mymodule_form';
  return $form;
}

第二步: 校验数据 hook_validate()。参考:http://api.drupal.org/api/drupal/modules%21node%21node.api.php/function/hook_validate/7
/**
 * Implements hook_validate().
 */
function mymodule_validate($node, $form, &$form_state) {
  if(!$node->my_description){
    form_set_error('my_description','请输入内容');
  }
}

第四步: 对数据的增删改成。根据需要
function mymodule_node_insert($node) {
  //根据内容类型,只需要保存扩展的数据即可。无返回。
}

function mymodule_node_delete($node) {
  //根据内容类型,只需要删除扩展的数据即可。无返回
}

function mymodule_node_update($node) {
  //根据内容类型,只需要更新扩展的数据即可。无返回。
}

function mymodule_node_load($nodes, $types) {
  //根据内容类型,查询扩展的数据合并到$nodes即可。无返回。
}

第五步,自定义添加内容的表单,把扩展数据包含进去。

Drupal 6 自定义分页样式一例

在主题下的template.php文件中,增加下面的函数:

function default_pager($tags = array(), $limit = 11, $element = 0, $parameters = array(), $quantity = 4) {
  global $pager_page_array, $pager_total;
  $output = '';  //保存分页的html字符串

  //获取当前URL,如果其中已经有page=x,则删除它
  $this_path=request_uri();
  $temp_pager=$_GET['page'];
  if(is_numeric($temp_pager)){
    $this_path=str_replace('&page='.$temp_pager,'',$this_path);
  }

  if ($pager_total[$element] > 1) { //如果只有一页,则无分页
    $pager_cur=$pager_page_array[$element];  //当前页面的页码

    if($_GET['q']=='news'){ //如果当前路径为 news,则采用上下页的分页方式。
      if($pager_cur>0){
        $output .= '<input name="" class="btn" type="button" value="上一页"  javascript:  onclick="javascript:window.location.href='."'".$this_path."&page=".($pager_page_array[$element]-1)."'".'" />';
      }
      if(($pager_cur+1)<$pager_total[$element]){
        $output .= '<input name="" class="btn" type="button" value="下一页"  javascript:  onclick="javascript:window.location.href='."'".$this_path."&page=".($pager_page_array[$element]+1)."'".'" />';
      }

      return $output;
    }

    $output = '<div class="content_pager">'."\n".'<div class="com_pager">';
    $pager_list=array();  //current available pager numbers
    $n=floor($pager_cur/$quantity);

    if ($n == 0){
      $i=0;
      $max=$quantity;
    }
    else {
      $i=$quantity*$n;
      $max=$i + $quantity;
    }

    while($i<($pager_total[$element]) && $i<$max){
      $pager_list[$i]=array('pager'=>$i,'title'=>$i+1);
      $i+=1;
    }

    foreach($pager_list as $key=>$item){

      if($pager_cur < $quantity) {
        $output.='<span class="disabled"> < </span>';
      }
      else {
        $output.='<a href="'.$this_path.'&page='.($item['pager']-1).'"> < </a>';
      }

      if($item['pager'] == $pager_cur) {
        $output.='<span class="current">'.$item['title'].'</span>';
      }
      else {
        $output.='<a href="'.$this_path.'&page='.$item['pager'].'"> '.$item['title'].' </a>';
      }
    }

    if ($item['pager'] < ($pager_total[$element]-1)) {
      $output.='<a href="'.$this_path.'&page='.($item['pager']+1).'"> > </a>';
    }
    else {
      $output.='<span class="disabled"> > </span>';
    }

    $output.= '</div>'."\n".'</div>';
  }

  return $output;
}

在需要分页的地方打印$pager即可(<?php print $pager; ?>),但前提条件是查询时使用了分页查询:pager_query($sql, $step, 0, $countsql);

该函数在Drupal 6下测试通过。