作者enjoyloli (M)
看板Python
标题[问题] 矩阵数值写成bin档
时间Wed May 4 17:57:28 2016
请问各位高手高手高高手
因为最近在研究树莓派上用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
想请问各位高手有没有推荐的写法与函式可以参考呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.163.206.30
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1462355851.A.82A.html
1F:→ s860134: 你找到的 code 和你做的事情是反操作他会把 65371 转成 05/05 00:16
2F:→ s860134: [255,91] 05/05 00:16
3F:→ s860134: 两个一组 [A,B] 当第一个数小於127时 为 (A<<8)+B 05/05 00:51
4F:→ s860134: 第一个数大於 127时 为 (((A<<8)+B)^0xFFFF)*-1 05/05 00:52
5F:→ s860134: 原理为2的补数...只能说计概考完期末就还老师了 XD 05/05 00:53
6F:→ s860134: 修正一下,应该是 大於等於(代表整个数字是负数) 05/05 00:55
7F:→ s860134: def test(A,B): 05/05 00:57
8F:→ s860134: return ((A << 8) + B) if A < 127\ 05/05 00:59
9F:→ s860134: else ((((A<<8)+B)^0xFFFF)*-1) 05/05 00:59
10F:→ s860134: 阿干 是 1的补数 对不起,真的还给老师.... 05/05 01:03
11F:→ yjc1: struct.unpack('>3h', binary_string) 05/05 01:13
12F:→ s860134: 仔细想想我写的不是你要的,bytes([255,91])就可以写档了 05/05 08:51
13F:推 kanggy: 第一组应该是-165. 原值-65536 (负值多一) 05/05 09:26
14F:→ kanggy: 取值用yjc1 写的方式; a = [255, 91] 05/05 09:29
15F:→ kanggy: b = pack('BB', a[0], a[1]) 05/05 09:30
16F:→ kanggy: c = unpack('>1h', b) 05/05 09:30
17F:→ enjoyloli: 请问有A << 8 的教学文件吗@@ 想参考一下 05/05 10:24
18F:→ enjoyloli: 感谢大家 问题解决了XD 05/05 13:36
19F:→ Cypresslin: keyword for "<<": Bitwise operation 05/05 15:35
20F:→ s860134: 就是把数字在2进位中进8位, 类似10进位中 *10^8 的意思 05/06 01:57
21F:推 disap: read block data 应该有回传 byte 的版本, 你得到的结果比 05/08 10:56
22F:→ disap: 较像 read word data, 先试着找一下正确的api, 真的没有再 05/08 10:56
23F:→ disap: 用上层补救 05/08 10:56