[问题] 矩阵数值写成bin档

楼主: enjoyloli (M)   2016-05-04 17:57:28
请问各位高手高手高高手
因为最近在研究树莓派上用i2c 读取 mpu9250
用了 smbus.i2c.read_block_data
读出来的资料我用print:
[255, 91, 255, 136, 3, 191]
而正确的值是 -164, -119, 959
也就是要先把每两组数字,比如说第一组: 255, 91,各别转成16进位: FF, 5B
然后再把 FF5B 转换成十进制 65371,然后再用65535去减
目前小弟就是先用大量的read_block_data,取得大量
类似[255,91,255,136,3,191]这样的lsit资料,再另外用hex()写程式解码
但是感觉这样很笨="= 想找更好的函式,直接把16进位数值写成.bin档储存
有查到类似bytes(), bytearray(), 也有人在stackoverflow贴范例CODE:
def splitNumber (num):
lst = []
while num > 0:
lst.append(num & 0xFF)
num >>= 8
return lst[::-1]
with open(fileName, 'br+') as f:
for number in numbers:
f.write(bytes(splitNumber(number)))
但是实在是看不懂QQ
想请问各位高手有没有推荐的写法与函式可以参考呢?
作者: s860134 (s860134)   2016-05-05 00:16:00
你找到的 code 和你做的事情是反操作他会把 65371 转成[255,91]两个一组 [A,B] 当第一个数小于127时 为 (A<<8)+B第一个数大于 127时 为 (((A<<8)+B)^0xFFFF)*-1原理为2的补数...只能说计概考完期末就还老师了 XD修正一下,应该是 大于等于(代表整个数字是负数)def test(A,B):return ((A << 8) + B) if A < 127\else ((((A<<8)+B)^0xFFFF)*-1)阿干 是 1的补数 对不起,真的还给老师....
作者: yjc1 (.来而色月踏我.)   2016-05-05 01:13:00
struct.unpack('>3h', binary_string)
作者: s860134 (s860134)   2016-05-05 08:51:00
仔细想想我写的不是你要的,bytes([255,91])就可以写档了
作者: kanggy ((我还在,只是热情不再))   2016-05-05 09:26:00
第一组应该是-165. 原值-65536 (负值多一)取值用yjc1 写的方式; a = [255, 91]b = pack('BB', a[0], a[1])c = unpack('>1h', b)
楼主: enjoyloli (M)   2016-05-05 10:24:00
请问有A << 8 的教学文件吗@@ 想参考一下感谢大家 问题解决了XD
作者: Cypresslin (啊哈哈~~)   2016-05-05 15:35:00
keyword for "<<": Bitwise operation
作者: s860134 (s860134)   2016-05-06 01:57:00
就是把数字在2进位中进8位, 类似10进位中 *10^8 的意思
作者: disap ( )   2016-05-08 10:56:00
read block data 应该有回传 byte 的版本, 你得到的结果比较像 read word data, 先试着找一下正确的api, 真的没有再用上层补救

Links booklink

Contact Us: admin [ a t ] ucptt.com