[python]常用的类型间转换

python牵涉的数据类型比较繁多,编程过程中,经常需要在不同类型的数据之间进行恰当的转换

1、int转bytes

>>> x=97
>>> y=str(x) #转str
>>> print(type(y))
<class 'str'>
>>> print(y.encode()) #转bytes
b'97'
>>>

2、bytes转uint

#
def U4(a):
    '''将单个bytes类型的字符a转换成int返回'''
    a_int = int.from_bytes(a,byteorder='big',signed=False)
    if a_int>=97:#0xa~0xf
        a_int = a_int - 87
    else:
        a_int = a_int - 48
    return a_int

def U8(a):
    '''将bytes类型的符号a(长度2,对应8bit)转成U8整数并返回'''
    if(len(a) != 2):
        print('error len')
    res = (U4(a[0:1])<<4) + U4(a[1:2])
return res

def U16(a):
    '''将bytes类型的符号a(长度4,对应16bit)转成U16整数并返回'''
    if(len(a) != 4):
        print('error len')
    res = (U8(a[0:2])<<8) + (U8(a[2:4]))
    return res

def U32(a):
    '''将bytes类型的符号a(长度8,对应32bit)转成U32整数并返回'''
    if(len(a) != 8):
        print('error len')
    res = (U16(a[0:4]) <<16) + U16(a[4:8])
    return res
#

3、char转int

>>> x='a'
>>> y=ord(x) #转ascii
>>> print(y)
97
>>> z=hex(y)
>>> print(z)
0x61
>>> print(type(z))
<class 'str'>

4、bytes与str互转
 

>>> x=b'12'
>>> y=x.decode()  #bytes转str
>>> print(x)
b'12'
>>> print(y)
12
>>> print(type(y))
<class 'str'>
>>> z=y.encode('utf-8') #str转bytes
>>> print(z)
b'12'
>>> print(type(z))
<class 'bytes'>

5、使用struct模块实现字节流(bytes)数据的处理

def getBytesPack(array_data):
    '''将array_data序列数据(如['0x64', '0x0', '0x0', '0x0', '0x0', '0x0'])打包成bytes'''
    bytes_data = bytes()
    for i in range(len(array_data)):
        bytes_data += struct.pack('B', array_data[i])
    return bytes_data 

def getListfromByts(bytes_array):
    '''将字节流数据bytes_array(如b'd\x00\x00\x00\x00\x00')转变成序列数据'''
    rslt=list([])
    for i in range(len(bytes_array)):
        #rslt += struct.unpack('B',bytes_array[i])
        rslt.append(hex(bytes_array[i]))
    return rslt

6.批量转换c文件为utf8格式

import os
import sys
import codecs
import chardet

def convert(filename,out_enc="utf8"):
  try:
    content=codecs.open(filename,'rb+').read()
    source_encoding=chardet.detect(content)["encoding"]
    print(source_encoding)
    
    if source_encoding == "GB2312":
      content=content.decode(source_encoding).encode(out_enc)
      codecs.open(filename,'wb+').write(content)
  except IOError as err:
    print("I/O error:{0}".format(err))

def removeBom(file):
  '''移除UTF-8文件的BOM字节'''
  data = open(file,'rb+').read()
  if data[:3] == codecs.BOM_UTF8:
    data = data[3:]
    data.decode("utf-8")
    # print(data.decode("utf-8"))


def explore(dir):
  for root,dirs,files in os.walk(dir):
    for file in files:
      #print(file)
      #print(os.path.splitext(file)[1])
      if os.path.splitext(file)[1]=='.c' or os.path.splitext(file)[1]=='.h':
        print(file)
        path=os.path.join(root,file)
        convert(path)
        removeBom(path)

def main():
  explore(sys.argv[1])

if __name__=="__main__":
  '''用法:python codeUTF8.py 目标目录'''
  main() 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值