如何使用struct.unpack将float转换为二进制文件?

时间:2017-09-25 16:58:45

标签: python binary

我试图将浮点数转换为二进制数。

我正在使用模块结构。例如,值为3.5,当我执行此行时:

struct.pack('>f',3.5)

我明白了:

b'@`\x00\x00'

我想两个x00 x00表示每个字节使用的十六进制值,但是b和' @`?

2 个答案:

答案 0 :(得分:0)

格式字符串delivery.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { LayoutInflater inflater1 = (LayoutInflater) ct.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v1 = inflater1.inflate(R.layout.activity_employees_list_for_pop_up, null); RadioButton employeechecked = (RadioButton) v1.findViewById(R.id.employeeChecked); final Button ok = (Button) v1.findViewById(R.id.do_ok); Button cancle = (Button) v1.findViewById(R.id.do_cancle); ok.setEnabled(false); listView = (ListView) v1.findViewById(R.id.employeePopUpList); employeePopUpAdapter = new EmployeePopUpAdapter(ct, employeeIdNameBeans); employeechecked.setOnCheckedChangeListener(new ); listView.setAdapter(employeePopUpAdapter); AlertDialog.Builder builder; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { builder = new AlertDialog.Builder(ct, android.R.style.Theme_Material_Dialog_Alert); } else { builder = new AlertDialog.Builder(ct); } builder.setView(v1); builder.create().show(); clearListView(); update(); } }); 表示

'>f' IEEE 754 binary32(4个字节,类似C浮点数)

'f' big-endian字节顺序,标准尺寸

记录了here。当表示为ASCII时,字符'>'@只是数字数据(3.5)的一部分。查看表示为二进制的这4个字节可能更有帮助:

`

如此连接为32位浮点数,它具有这样的二进制表示:

>>> format(ord('@'), '08b')
'01000000'
>>> format(ord('`'), '08b')
'01100000'
>>> format(ord('\x00'), '08b')
'00000000'

要手动将二进制表示转换回float,请在此处阅读single-precision floating-point format,并将其拆分为组件而不是字节。这是符号位,指数(8位无符号整数,offset-encoded)和小数(23位):

>>> ''.join(format(x, '08b') for x in b'@`\x00\x00')
'01000000011000000000000000000000'

这里的指数只有1,因为该表示偏移了127:

0 10000000 11000000000000000000000

小数部分类似于1.11 2 ,即

>>> int('10000000', 2) - 127
1

正符号位(-1) 0 = 1,指数1,数字为3.5(恰好是一个可以完全表示为浮点数的数字)。

答案 1 :(得分:0)

没有问题 - b''文字已经是二进制字节类型(旧的传统,因为2.x)。

>>> struct.pack('>f',3.5)
b'@`\x00\x00'
>>> a = struct.pack('>f',3.5)
>>> type(a)
<class 'bytes'>