Python中二进制和浮点类型互转

Python IEEE754 二进制字符串转浮点数 Python2.7 IEEE 754字符串转浮点数 想法其实很简单: (1)取符号位: 对应str[0] (2)取阶码:对应str[1:9] (3)取尾码:对应str[9:] (4)计算小数点位置 (5)根据小数点切分尾码,分别计算整数和小数部分 (6)特殊情况处理:0,NaN,无穷… def ConvertExponent(strData):#阶码转整数 return int(strData,2)-127 def ConverComplementToFixedDecimal(fixedStr) 阅读详情

Python中二进制和浮点类型互转

因为有某些需求需要修改float类型的二进制位数,但是发现float32无法直接进行位运算,所以通过学习一些基本的float机器表示方法来自己写了用来转化的一些功能函数。
参考:https://zhuanlan.zhihu.com/p/137616403

float转二进制

#整数部分计算
def int_bin(num):
    ans = ''
    while num != 0:
        ans += str(num&1)
        num = num >> 1
    return ans[::-1]

#小数部分计算
def decimal_bin(num,bit_cnt=24):
    ans = ''
    while num != 0 and len(ans) < bit_cnt:
        tmp = int(num*2)
        ans += str(tmp)
        num = num*2 - tmp
    return ans

#指数部分计算
def exp_bin(exp,bit_cnt = 8):
    ans = ''
    while exp != 0:
        ans += str(exp&1)
        exp = exp >> 1
    while len(ans) != bit_cnt:
        ans += str(0)
    return ans[::-1]

#计算float32转二进制表示,返回结果为string类型,32位
def float32_bin(num):
    if num == 0:
        return '0'*32
    sign = 1
    if num>0:
        sign = 0       #符号位为1
    int_par = int_bin(int(num))
    decimal_par = decimal_bin(num - int(num))
    exp = len(int_par) - 1 + 127    #获取阶码位数,需要让整数位为1
    if len(int_par) == 0:
        dot_pos = decimal_par.find('1') + 1    #没有整数部分,小数要找到对应的1
        exp -= dot_pos - 1      #减的1是为了上面减的1,有整数部分的和没有的不同
        decimal_par = decimal_par[dot_pos:]
    base = int_par[1:] + decimal_par
    while len(base) < 23:      #一共23位尾数位补齐
        base += str(0)
    exp_par = exp_bin(exp)
    ans = str(sign) + exp_par + base
    return ans[:32]

#计算float64转二进制表示,返回结果为string类型,64位
def float64_bin(num):
    if num == 0:
        return '0'*64
    sign = 1
    if num>0:
        sign = 0       #符号位为1
    int_par = int_bin(int(num))
    decimal_par = decimal_bin(num - int(num),bit_cnt=52)
    exp = len(int_par) - 1 + 1023    #获取阶码位数,需要让整数位为1
    if len(int_par) == 0:
        dot_pos = decimal_par.find('1') + 1    #没有整数部分,小数要找到对应的1
        exp -= dot_pos - 1      #减的1是为了上面减的1,有整数部分的和没有的不同
        decimal_par = decimal_par[dot_pos:]
    base = int_par[1:] + decimal_par
    while len(base) < 52:      #一共52位尾数位补齐
        base += str(0)
    exp_par = exp_bin(exp,bit_cnt=11)
    ans = str(sign) + exp_par + base
    return ans[:64]

二进制转float

#二进制部分指数数值计算
def bin_exp(num_str,bit_cnt=8):
    ans = 0
    pivot = 127 if bit_cnt == 8 else 1023
    for i in range(bit_cnt):
        ans <<= 1
        ans |= int(num_str[i])  #从低位开始取
    return ans - pivot    #阶数小于127则为纯小数,此处返回和127的差值

#二进制部分整数数值计算
def bin_int(num_str):
    num_str = '1' + num_str      #把尾数的前导1加上
    ans = 0
    for i in range(len(num_str)):
        ans <<= 1
        ans |= int(num_str[i])
    return ans

#二进制部分小数数值计算
def bin_decimal(num_str):
    ans = 0
    for i in range(len(num_str)):
        ans = (ans + 2**(-(i+1))) if num_str[i]=='1' else ans
    return ans

def bin_float32(num_str):
    sign = 1
    if num_str[0] == '1':
        sign = -1
    exp = bin_exp(num_str[1:9])
    int_par = 0
    if exp < 0:    #纯小数的情况
        decimal_par = bin_decimal('0'*(abs(exp)-1)+'1'+num_str[9:])
    else:
        int_par = bin_int(num_str[9:9+exp])      
        decimal_par = bin_decimal(num_str[9+exp:])
    ans = sign * (int_par+decimal_par)
    return ans

def bin_float64(num_str):
    sign = 1
    if num_str[0] == '1':
        sign = -1
    exp = bin_exp(num_str[1:12],bit_cnt=11)
    int_par = 0
    if exp < 0:    #纯小数的情况
        decimal_par = bin_decimal('0'*(abs(exp)-1)+'1'+num_str[12:])
    else:
        int_par = bin_int(num_str[12:12+exp])      
        decimal_par = bin_decimal(num_str[12+exp:])
    ans = sign * (int_par+decimal_par)
    return ans

float尾数位修改

def modify_float(num,pos_seq,replace_seq,type=32):    #pos_seq为修改位置(位置从尾数位最低位开始计算,0-x),replace_seq为具体修改的值
  if len(pos_seq) != len(replace_seq):
    print("修改序列位置和长度不一致")
    return None
  num_bin = float64_bin(num) if type == 64 else float32_bin(num)
  list_bin = list(num_bin)
  idx = 0
  border = 51 if type == 64 else 22 
  for i in pos_seq:
    if i > border:
      print("超过尾数修改范围")
      return None
    list_bin[type-1-i] = str(replace_seq[idx])
    idx += 1
  num_bin = "".join(list_bin)
  return bin_float64(num_bin) if type == 64 else bin_float32(num_bin)

字符和二进制的互转

#计算单个char(8位字符在数字和二进制之间的转换)
def str_bits(str):
  ret = bin(ord(str))[2:]
  while len(ret) != 8:
    ret = '0' + ret
  return list(ret)
  
def bits_str(bits):
  ret = 0
  tmp = "".join(bits)
  for i in range(len(tmp)):
    ret <<= 1
    ret |= int(tmp[i])
  return chr(ret)
Python二进制文件读取并转换为浮点数详解 主要介绍了Python二进制文件读取并转换为浮点数详解,用python读取二进制文件,这里主要用到struct包,而这个包里面的方法主要是unpack、pack、calcsize。,需要的朋友可以参考下 立即下载

相关推荐

PyTorch实战:手把手教你用QAT量化感知训练拯救模型精度(附避坑指南)

本文详细介绍了如何使用PyTorch进行QAT量化感知训练,以提升模型在边缘设备上的推理精度。通过核心原理讲解、实战代码示例和避坑指南,帮助开发者掌握从环境配置、模型训练到边缘部署的全流程,有效解决传统量化方法导致的精度损失问题。

c7d8e的博客 326

python将二进制转换为32位浮点数float/两个16位整数(高位字/低位字)Uint16转换为32位浮点数float

python将二进制转换为32位浮点数float/两个16位整数(高位字/低位字)Uint16转换为32位浮点数float

dlwlrma_516的博客 4024

发票OFD格式转换成PDF

发票OFD格式转换成PDF

Be_insighted的博客 931

Python 二进制文件转浮点

  首先导入所需的包:import struct struct有以下几个主要的函数: # 按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流) pack(fmt, v1, v2, ...) # 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple unpack(fmt, string) # 计算给定的格式(fmt)占用多少...

Linias的博客 5390

别再手动上传了!用宝塔面板的‘Let‘s Encrypt’免费SSL证书,3分钟自动续期

本文详细介绍了如何利用宝塔面板的‘Let‘s Encrypt’功能实现SSL证书的自动申请和续期,3分钟完成配置即可永久免费使用。通过对比不同SSL证书方案,突出Let's Encrypt的免费、自动续期和高安全性优势,特别适合个人博客和中小企业官网。

weixin_30415113的博客 150

LRTimelapse Pro v7.0.0 激活版下载安装教程 (延迟摄影后期渲染)

LRTimelapse Pro 是一款优秀的高级延时摄影解决方案,使用将为用户提供最全面的工具和功能,从导入和组织您的延时摄影序列、视觉工作流程、在 LRTimelapse 中直接编辑和渲染、视觉去闪烁等等,功能齐全,可以使用 LRTimelapse Pro 编辑多个序列时显著提高您的效率,轻松在 LRTimelapse 中配置和使用色彩管理,进行长期延时编辑,在 LRTimelapse Pro 中使用长期工作流程。为延时编辑、关键帧、分级和渲染提供最全面的解决方案。

wyqshusan的博客 3464

二进制转浮点数在线计算工具

二进制转浮点数在线计算工具,将32位二进制序列转化为浮点数的计算器

key12315的专栏 1316

伺服电机的位置控制模式:PP模式与CSP模式的比较

在轮廓位置模式下,上位机给定目标绝对位置(或相对位置)、速度、加速度等参数,伺服内部的轨迹发生器根据这些参数生成目标位置曲线指令,通过伺服驱动器内部实现三环控制(位置环、速度环、力矩环)。如果还不理解,不妨看看下面的类比:轮廓位置模式中,上位控制器对伺服电机说,我给你个位置,怎么去哪,走那条路,那是你自己的事,这个时候伺服电机是有自己的思想的。同期同步位置模式红,上位机控制器对伺服电机的管理就和 严格,除了告诉你目标位置,走那条路都是控制器说的算,伺服电机就是个没有灵魂的工具。重点关注,轮廓位置模式。

m0_49968063的博客 5802

十进制浮点数转化为二进制的Python代码

#十进制浮点数转二进制 def dectbin(num): # 判断是否为浮点数 if num == int(num): # 若为整数 integer = '{:b}'.format(int(num)) return integer else: # 若为浮点数 # 取整数部分 integer_part = int(num) # 取小数部分 decimal_p

Fo*(Bi)的博客 8421

EGO_Plannerv2代码学习(一):栅格建图之V1 V2的区别

最近在尝试将高飞老师的集群规划器部署到真实无人机上跑一下,开这个新帖记录下学习过程中的问题和想法。

qq_41069236的博客 5749

Python爬虫实战 | 拼多多商品评论采集与深度分析

本文从 API 调用、网页渲染到情感分析与关键词提取,全流程剖析了“拼多多商品评论采集与分析”项目。Scrapy + API 可快速抓取评论;Playwright 可突破 API 限制,抓取完整页面内容;数据清洗 + 分析揭示用户真实反馈;可持续部署、扩展至更多商品 & 时间段;

2201_76125261的博客 1696

Python中字符串和二进制互转

        最近在搞图形相关的东西,有时候操作涉及到每个 比特 的操作,所以必须实现一个方法(将字符串二值化),就是把字符串转换成为二进制形式。搜索了一些相关的实现,但是本篇只对两种进行介绍,并且个人推荐第二种。         第一种...

小郎人的博客 7842

【K8S系列】在 Kubernetes 中使用 Prometheus 进行监控的详细指南

Prometheus 是一个开源的监控和报警工具,广泛用于 Kubernetes 环境中。本文将深入探讨如何通过 Kubernetes 中的注解配置 Prometheus 的抓取设置,以高效监控服务,并确保系统的可靠性和可维护性。

颜淡慕潇 2万+

Python PIL和二进制图片互转

利用BytesIO实现PIL和二进制互转

XerCis的博客 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Python 图片转数组,二进制互转

前言 需要导入以下包,没有的通过pip安装 import matplotlib.pyplot as plt import cv2 from PIL import Image from io import BytesIO import numpy as np 1.图片和数组互转 # 图片转numpy数组 img_path = "images/1.jpg" img_data = cv2.imre...

分享深度学习,机器学习,大模型的相关知识 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

python将图片转为二进制_python 图片 数组到二进制的互相转换

需要导入以下包,没有的通过pip安装import matplotlib.pyplot as pltimport cv2from PIL import Imagefrom io import BytesIOimport numpy as np1.图片和数组互转# 图片转numpy数组img_path = "images/1.jpg"img_data = cv2.imread(img_path)# n...

weixin_39831991的博客 6487

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

python进制转化函数,10进制字符串互转,16进制字符串互转

来了老弟,emmmmm,今天想到平时经常用到编码转化,把字符串转化为16进制绕过等等的,今天想着用python写个玩,查询了一些资料,看了些bolg 上面的两个函数是将二进制流转化为16进制,data的每一个比特都被转为对应十六进制的2位,因此返回结果是data长度的二倍。 下面的两个函数意思是将十六进制串转为二进制流,其中十六进制串长度必须是偶数,否则返回类型错误 直接上代...

weixin_30443731的博客 1886

python 图片 数组到二进制的互相转换

本文转自这里 需要导入以下包,没有的通过pip安装 import matplotlib.pyplot as plt import cv2 from PIL import Image from io import BytesIO import numpy as np 1.图片和数组互转 # 图片转numpy数组 img_path = "images/1.jpg" img_data = cv2.i...

chenpe32cp的博客 1万+

python二进制和图片转换

python二进制和图片转换 之前做项目,发现很多图片都是存储成二进制的形式,比如存储为.bin .dat等文件,如果你直接用记事本打开文件,会发现里面内容如下: 0005 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000...

CoderWangSon 2万+

Python-十六进制、二进制互转

Python-十六进制转二进制 hex_tuple = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F') repair_list = [] binary_list = [] def check_str(): """检验所输入字符串是否为十六进制字符,且不区分大小写""" input_str = input('请输入待转十六进制数:') frist_deal = inpu

YIGAOYU的博客 4553

[python相关]binascii:二进制和ASCII互转

20.1 binascii:二进制和ASCII互转 作用:二进制和ASCII互相转换。 Python版本:1.5及以后版本          binascii模块包含很多在二进制和ASCII编码的二进制表示转换的方法。通常情况不会直接使用这些功能,而是使用像UU,base64编码,或BinHex封装模块。 binascii模块包含更高级别的模块使用的,用C语言编写的低级高效功能。

zyflying的专栏 6052

二进制与文本互转工具介绍

二进制与文本互转工具介绍 去发现同类优质开源项目:https://gitcode.com/ 工具简介 本仓库提供的二进制与文本互转工具是一款方便实用的转换工具。它支持Windows XP和Windows 7操作系统,可以轻松实现字节、字、双字等不同数据类型的转换,并且支持大小端模式切换,极大地方便了用户在不同场景下的数据处理需求。 该工具由Python编写,具有较好的兼容性和稳定性,用户无需担心因...

gitblog_06793的博客 480

python 二进制图片数据和cv2图片数据互转

有时,需要进行opencv Mat图片数据和二进制数据互转操作,转换如下 with open(image_path, "rb") as file: jpg_bin = file.read() image = cv2.imdecode(np.asarray(bytearray(jpg_bin),dtype='uint8'), cv2.IMREAD_COLOR) ...

u011337602的博客 8174

Python OpenCV cv2和二进制图片互转

二进制图片转cv2:cv2.imdecode(np.array(bytearray(image), dtype='uint8'), cv2.IMREAD_UNCHANGED)。 cv2转二进制图片:np.array(cv2.imencode('.png', im)[1]).tobytes()。

XerCis的博客 1万+

python读取二进制图片_Python读入mnist二进制图像文件并显示实例

图像文件是自己仿照mnist格式制作,每张图像大小为128*128import structimport matplotlib.pyplot as pltimport numpy as np#读入整个训练数据集图像filename = 'train-images-idx3-ubyte'binfile = open(filename, 'rb')buf = binfile.read()#读取头四个3...

weixin_39531582的博客 425
上一篇: 蓝桥C++省赛B组--J:网络分析
下一篇: RY-Cloud使用docker配置组件运行
binary str
博客等级 码龄8年 18粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值