# 字符 字符:顾名思义。 字符串:顾名思义。 码位:字符的标识。Unicode标准以十六进制数字表示,加前缀“U+”。如字母A的Unicode码位为U+0041。 编码:把码位转换成字节序列的过程,码位和字节序列之间的转换算法为编码方式。在UTF-8编码中,A(U+0041)的码位编码为单字节\x41,在UTF-16LE编码中,A(U+0041)的码位编码为两个字节\x41\x00。 解码:把字节序列转换成码位的过程,字节序列和码位之间的转换算法为编码方式。 ```mermaid flowchart LR A[码位] <---->|编码方式| B[字节序列] ``` ```mermaid flowchart LR A[str对象] <----->|编码方式| B[bytes对象] ``` ```python name = 'wangyuedong' type(name) # len(name) #11 #编码 name_encode = name.encode('utf8') #b'wangyuedong' type(name_encode) # len(name_encode) #11 #解码 name_decode = name_encode.decode('utf8') #wangyuedong n = "汪跃东" type(n) # len(n) #3 n_encode = n.encode('utf8') #b'\xe6\xb1\xaa\xe8\xb7\x83\xe4\xb8\x9c' type(n_encode) # len(n_encode) #9 n_decode = n_encode.decode('utf8') ``` # 二进制序列类型 ## bytes 不可变类型数据,占用1个字节,值介于[0, 255]之间。二进制序列其实是整数序列。显示以三种方式显示。 - 可打印的ASCII范围内的字节,以字符本身显示。 - 制表符、换行符、回车符和\对应的字节,以转义序列显示`\t`、`\n`、`\r` 和 `\\`。 - 其他字节的值使用十六进制转义序列显示。 ## bytes构造方法 ```python #空的字节 bytes() #i个空字节, i为整型 bytes(i) #可迭代对象 bytes(iteratable) # bytes('str', encode) ``` ## bytes函数 `bytes()` 函数返回一个新的`bytes`对象,该对象为一个[0, 255]区间的整数不可变序列。 ```python bytes([source[, encoding[, errors]]]) 如果 source 为整数,则返回一个长度为 source 的初始化数组; 如果 source 为字符串,则按照指定的 encoding 将字符串转换为字节序列; 如果 source 为可迭代类型,则元素必须为[0 ,255] 中的整数; 如果 source 为与 buffer 接口一致的对象,则此对象也可以被用于初始化 bytearray。 如果没有输入任何参数,默认就是初始化数组为0个元素。 a = bytes('wang', 'ascii') a b'wang' b = bytes('wang', 'utf8') b b'wang' ``` ## bytes常用方法 ```python #修改, bytes和str都是不可修改的类型,所谓的修改,都是创造一个新的bytes bytes.replace(b'f', b's') #查找 bytes.find(b'u') #从十六进制字节生成 bytes.fromhex('hexstr') ``` ## bytearray 多个bytes类型的数据组成一个数组,就是bytearray字节数组。数组内的元素为可变类型数据,每一个元素占用1个字节,值介于[0, 255]之间。 ## bytearray构造方法 ```python #空的字节数组 bytearray() #i个元素的字节数组, i为整型 bytearray(i) # bytearray(interatable_of_int) # bytearray('str', encode) # bytearray(bytes_or_buffer) ``` ## bytearray常用方法 ```python bytearray.append(int) bytearray.insert(index, int) bytearray.extend(iterable_of_int) bytearray.pop() bytearray.remove(value) byterarray.clear() bytearray.reverse() ``` # numpy和字节串相互转化 ndarray.tostring 方法实际上是ndarray.tobytes 方法的别称,使用的方法是一个方法,就是说转< ndarray >类型会自动转换成< bytes >类型,可以查看[官方api文档](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.tostring.html)。 ## 一、通过tostring和fromstring tostring会将数组直接转换成字节串,并且会损失类型信息(dtype)和维度信息(shape),因此在实际传输中,除了把字节串传输过去外,还需要把数组的dtype和shape传输过去。 ```python import numpy as np a1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) a1_dtype = str(a1.dtype) a1_shape = str(a1.shape) print(a1.dtype) #int32, float64 print(a1.shape) #(3, 3) s1 = a1.tostring() print(s1) print(type(s1)) #从字节序列还原成numpy数组 a2 = np.fromstring(s,dtype=np.int32).reshape((3,3,3)) a2 = np.fromstring(s,dtype=getattr(str(a1.dtype))).reshape(a1.shape) a2 = np.fromstring(s,dtype=getattr(str(a1_dtype))).reshape(eval(a1_shape)) ``` ## 二、将数组转换成列表,列表转换成字符串 使用numpy里的tolist()方法可以彻底将数组转换成列表,而python中的eval()函数能从字符串中读取出list类型的数据,将整个字符串执行一遍并返回其结果。 ```python import numpy as np a1 = np.array([[[1,2,3],[4,5,6],[7,8,9]],[[11,22,33],[44,55,66],[77,88,99]],[[111,222,333],[444,555,666],[777,888,999]]]) my_list1 = a1.tolist() print(my_list1) s = "np.array({})".format(my_list1) a2 = eval(s) print(a2) ```