• python经常使用的十进制、16进制、字符串、字节串之间的转换(长期更新帖)


    进行协议解析时。总是会遇到各种各样的数据转换的问题,从二进制到十进制,从字节串到整数等等

    废话不多上。直接上样例

    整数之间的进制转换:

    • 10进制转16进制: hex(16)  ==>  0x10
    • 16进制转10进制: int('0x10', 16)  ==>  16

    类似的还有oct(), bin()


    -------------------


    字符串转整数:

    • 10进制字符串: int('10')  ==>  10
    • 16进制字符串: int('10', 16)  ==>  16
    • 16进制字符串: int('0x10', 16)  ==>  16



    -------------------


    字节串转整数:

    • 转义为short型整数: struct.unpack('<hh', bytes(b'x01x00x00x00'))  ==>  (1, 0)
    • 转义为long型整数: struct.unpack('<L', bytes(b'x01x00x00x00'))  ==>  (1,)



    -------------------


    整数转字节串:

    • 转为两个字节: struct.pack('<HH', 1,2)  ==>  b'x01x00x02x00'
    • 转为四个字节: struct.pack('<LL', 1,2)  ==>  b'x01x00x00x00x02x00x00x00'



    -------------------


    字符串转字节串:

    • 字符串编码为字节码: '12abc'.encode('ascii')  ==>  b'12abc'
    • 数字或字符数组: bytes([1,2, ord('1'),ord('2')])  ==>  b'x01x0212'
    • 16进制字符串: bytes().fromhex('010210')  ==>  b'x01x02x10'
    • 16进制字符串: bytes(map(ord, 'x01x02x31x32'))  ==>  b'x01x0212'
    • 16进制数组: bytes([0x01,0x02,0x31,0x32])  ==>  b'x01x0212'



    -------------------


    字节串转字符串:

    • 字节码解码为字符串: bytes(b'x31x32x61x62').decode('ascii')  ==>  12ab
    • 字节串转16进制表示,夹带ascii: str(bytes(b'x01x0212'))[2:-1]  ==>  x01x0212
    • 字节串转16进制表示,固定两个字符表示: str(binascii.b2a_hex(b'x01x0212'))[2:-1]  ==>  01023132
    • 字节串转16进制数组: [hex(x) for x in bytes(b'x01x0212')]  ==>  ['0x1', '0x2', '0x31', '0x32']



    ===================

    測试用的python源代码

    '''
    Created on 2014年8月21日
    
    @author: lenovo
    '''
    import binascii
    import struct
    
    
    def example(express, result=None):
        if result == None:
            result = eval(express)
        print(express, ' ==> ', result)
    
    
    if __name__ == '__main__':
        
        print('整数之间的进制转换:')
        print("10进制转16进制", end=': ');example("hex(16)")
        print("16进制转10进制", end=': ');example("int('0x10', 16)")
        print("相似的还有oct(), bin()")
        
        print('
    -------------------
    ')
        
        print('字符串转整数:')
        print("10进制字符串", end=": ");example("int('10')")
        print("16进制字符串", end=": ");example("int('10', 16)")
        print("16进制字符串", end=": ");example("int('0x10', 16)")
        
        print('
    -------------------
    ')
        
        print('字节串转整数:')
        print("转义为short型整数", end=": ");example(r"struct.unpack('<hh', bytes(b'x01x00x00x00'))")
        print("转义为long型整数", end=": ");example(r"struct.unpack('<L', bytes(b'x01x00x00x00'))")
    
        print('
    -------------------
    ')
    
        print('整数转字节串:')
        print("转为两个字节", end=": ");example("struct.pack('<HH', 1,2)")
        print("转为四个字节", end=": ");example("struct.pack('<LL', 1,2)")
        
        print('
    -------------------
    ')
        
        print('字符串转字节串:')
        print('字符串编码为字节码', end=": ");example(r"'12abc'.encode('ascii')")
        print('数字或字符数组', end=": ");example(r"bytes([1,2, ord('1'),ord('2')])")
        print('16进制字符串', end=': ');example(r"bytes().fromhex('010210')")
        print('16进制字符串', end=': ');example(r"bytes(map(ord, 'x01x02x31x32'))")
        print('16进制数组', end =': ');example(r'bytes([0x01,0x02,0x31,0x32])')
        
        print('
    -------------------
    ')
        
        print('字节串转字符串:')
        print('字节码解码为字符串', end=": ");example(r"bytes(b'x31x32x61x62').decode('ascii')")
        print('字节串转16进制表示,夹带ascii', end=": ");example(r"str(bytes(b'x01x0212'))[2:-1]")
        print('字节串转16进制表示,固定两个字符表示', end=": ");example(r"str(binascii.b2a_hex(b'x01x0212'))[2:-1]")
        print('字节串转16进制数组', end=": ");example(r"[hex(x) for x in bytes(b'x01x0212')]")
        
        
        print('
    ===================
    ')
        print("以上原理都比較简单。看一下就明确了。
  • 相关阅读:
    Get distinct count of rows in the DataSet
    单引号双引号的html转义符
    PETS Public English Test System
    Code 39 basics (39条形码原理)
    Index was outside the bounds of the array ,LocalReport.Render
    Thread was being aborted Errors
    Reportviewer Error: ASP.NET session has expired
    ReportDataSource 值不在预期的范围内
    .NET/FCL 2.0在Serialization方面的增强
    Perl像C一样强大,像awk、sed等脚本描述语言一样方便。
  • 原文地址:https://www.cnblogs.com/Qing-Bo/p/10240833.html
Copyright © 2020-2023  润新知