在python中将字节转换为long

时间:2016-08-08 06:42:59

标签: python c struct ctypes endianness

这是我的C ++代码:

  int r; // result of log_2(v) goes here
  union { unsigned int u[2]; double d; } t; // temp

  t.u[__FLOAT_WORD_ORDER==LITTLE_ENDIAN] = 0x43300000;
  t.u[__FLOAT_WORD_ORDER!=LITTLE_ENDIAN] = v;
  t.d -= 4503599627370496.0;
  r = (t.u[__FLOAT_WORD_ORDER==LITTLE_ENDIAN] >> 20) - 0x3FF;
  return r;

我试图在python中完全复制这段代码,到目前为止我的代码是:

class s(Structure):
    _fields_ = [("u", c_ulonglong), ("d", c_double)]
  t = s()
  t.u = pack('<Q', c_ulonglong(int("0x43300000", 16))) # Error cannot convert argument to integer
  t.u = pack('>Q', c_ulonglong(v))
  t.d -= 4503599627370496.0
  r = (t.u >> 20) - 0x3FF

我在将“十六进制数”打包成“u”时遇到错误,就像在c ++代码中提到的那样。我想解决这个错误并在python中成功完成这段代码。

1 个答案:

答案 0 :(得分:0)

有一个完整的例子(这里有很多未定义的值)很有帮助,但这更接近于意图。请注意使用Unionc_int * 2

class s(Union):
    _fields_ = [("u", c_int * 2),
                ("d", c_double)]

t = s()
t.u[__FLOAT_WORD_ORDER==LITTLE_ENDIAN] = 0x43300000
t.u[__FLOAT_WORD_ORDER!=LITTLE_ENDIAN] = v # whatever that is
t.d -= 4503599627370496.0
r = (t.u[__FLOAT_WORD_ORDER==LITTLE_ENDIAN] >> 20) - 0x3FF
return r