python 字符串字节数,Python 字节数组

  python 字符串字节数,Python 字节数组

  计算机存储的几个概念

  二进制位是计算机中数据存储的最小单位,11010100是8位二进制数。一个二进制位只能代表0和1状态(2 ^ 1);两个二进制位可以表示00、01、10和11的四个(2 ^ 2)状态;一个三位数的二进制数可以代表八种状态(2 ^ 3).

  字节

  字节是计算机处理数据的基本单位。信息在计算机中是以字节存储和解释的。规定一个字节由八个二进制位组成,即一个字节等于八位(1字节=8位)。八位二进制数最低为0000000,最高为1111111;通常一个字节可以存储一个ASCII码,两个字节可以存储一个中国国标码。

  单词

  在计算机中,作为一个整体处理或计算的一串数字被称为计算机字,简称余。一个字通常被分成几个字节(每个字节通常是8位)。在内存中,每个单元通常存储一个字,所以每个字都是可寻址的。单词的长度是用数字表示的。在计算机的计算器和控制器中,通常是用文字来传递的。

  单词大小

  字长:在计算机技术中,CPU在单位时间内(同一时刻)一次能处理的二进制数的位数称为字长。因此,能够处理字长为8位的数据的CPU通常称为8位CPU。类似地,32位CPU可以在单位时间内处理字长为32位的二进制数据。

  以及字节长度和字长的区别:由于常见的英文字符可以用8位二进制表示,所以8位通常称为一个字节。一个字的长度不是固定的,对于不同的CPU,这个字的长度是不一样的。8位CPU一次只能处理一个字节,而32位CPU一次可以处理四个字节。类似地,64位CPU一次可以处理8个字节。

  常用编码ASCII: 1字节,只编码英文字母和符号。

  Gb2312: 2字节,增加了汉字和符号。

  Unicode:把所有语言统一成一套代码,把所有语言统一成一套代码,

  一般为2字节,生僻字为4字节。

  Utf-8:可变长度编码。常见的英文字母编码为1字节,汉字通常为3字节,只有生僻字编码为4-6字节。如果您要传输的文本包含大量英文字符,使用UTF-8编码可以节省空间:

  在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码,这样可以节省很多存储空间。

  python字符串每个用过Python (23)的人都应该读过下面两行错误消息:

  UnicodeEncodeError错误:“ascii”编解码器无法对位置0-1中的字符进行编码:序号不在范围内(128)

  UnicodeDecodeError错误:“utf-8”编解码器无法解码位置0-1中的字节:无效的连续字节

  这是Python中的‘黄金副本’!

  今天和接下来的几期将重点讨论Python中的字符串(str)、字节(bytes)及其相互转换(编码/解码)。也许你不能一下子解决所有的乱码问题,但我希望它能帮助你快速找到问题。

  定义Python中字符串的定义如下:

  Python中的文本数据是用字符串处理的。字符串是不可变的Unicode码位序列。

  在Python 3.5中,字符串是由一系列Unicode码位组成的不可变序列:

  在[1]中:

  ( S T R I N G) Out[1]:

  字符串不可变表示字符串本身不可更改:

  在[2]中:

  s= Hello print(s[3])s[3]= o l-type error trace back(最近一次调用last)Iphon-input-2-ce8cf 24852 F9 in module()1s= Hello 2 print(s[3])-3s[3]= o type error: str 对象不支持项赋值,序列(sequence)引用字符串继承序列类型(列表

  在[3]中:

  [i.upper() for i in hello] Out[3]:

  [H , E , L , L , O ]Unicode暂且可以看做是一张非常大的地图,上面记录了世界上所有的符号,码位就是每个符号对应的坐标(详细内容会在后面几期介绍)。

  在[4]中:

  s= rain print(s)print(len(s))print(s . encode())rain 1b \ xe9 \ x9b \ xa8 常用操作len:字符串长度;splitjoinfindindexstripupperlowerswapcasetitlecapitalizeendswithstartswithis*zfillIn[5]:

  #拆分连接=Hello world!打印(,)。join(s . split())#常见拆分重组操作 3359github.com/Rainyear/pytips.拆分(/,2) #有限拆分次数Hello,world!Out[5]:

  [6]中的[https:,, github.com/rainyear/pytips]:

  s= coffee print(s . find( f )#从左到右搜索并返回第一个下标print(s.rfind(f)) #从右到左搜索,返回下面第一个表print(s.find(a)) #如果不存在,返回-1print(s.index(a)) #如果不存在,抛出ValueError,其余同find,23-1 -。iphon-input-6-59556 FD 9319 f in module()4 5 print(s . find( a ))#不存在则返回-1-6print (s.index (a)) #不存在则抛出ValueError,其余与find相同。值错误:找不到子字符串。

  打印(“hello world”)。strip())print(helloworld 。strip( heo ))print([ I )。lstrip() ])print([ i 。rst rip()])hello world llow world[I][I]In[8]:

  打印( {}\n{}\n{}\n{}\n{} 。格式(“你好,世界”)。upper(),你好,世界。lower(), hello,WORLD 。swapcase(),你好,世界。大写(), hello,WORLD 。title()))你好,世界你好,世界你好,世界你好,世界你好,世界在[9]:

  print( { } { } { } { } { } { } { } { } { } { } { } { } 。格式( Python )。startswith(P ), Python 。startswith(y ), Python 。endswith(n ), Python 。endswith(o ), i23o6 。isalnum(), 1 2 3 0 6 。isalnum(), isalpha 。isalpha(), isa1pha 。isalpha(), python 。islower(), Python 。islower(), PYTHON 。isupper(), Python 。isupper(),))True False True False True False True False True False True False True False True False True False In[10]:

  101.zfill(8) Out[10]:

  00000101format/encode

  打印格式format是一个很有用的工具,会单独介绍;编码将在字节-解码-unicode-编码-字节中详细描述。

  Python字节和字节数组。字符串类型是人类友好的符号,但计算机只知道一种符号,即二进制数,或数字:

  上图来自OpenCV,非常直观的解释了计算机处理的信息和我们看到的图像之间的关系。回到Python对字节和字节数组的定义:

  操作二进制数据的核心内置类型是bytesandbytearray。

  1字节的ASCII为了用计算机能理解的数字来描述人类使用的字符,我们需要一个与字符对应的数字表。我们都知道,在计算机中,1byte=8bits可以存储0到255范围内的256个值,也就是说1byte最多可以代表256个字符。在最初的计算机世界中,256足以容纳所有大写和小写的英文字母、从0到9的阿拉伯数字以及一些常用的符号,因此出现了ASCII编码:

  在Python中创建字节类似于字符串,除了您需要在引号外添加前缀B:

  print(b python )python=(b p b y b t b o b n )print(python)b python b pyton bytes代表(二进制)数的序列,但它是经过ASCII编码后我们才看到的字符形式,而

  Print(bPython[0]) 80我们可以创建一个b* 形式的字节类型,前提是这里的*必须是ASCII中可用的字符,否则会超出限制:

  Print(b rain )文件“ipython-input-3-1f95d71c6553”,第1行print (b rain )语法错误:字节只能包含ASCII文字字符。错误说明:字节类型只允许ascii字符。

  0~127~255

  那么问题来了。我们发现上面ASCII表中的所有字符只占[31,127]。我们如何将这个范围之外的数字表示为字节类型?答案是使用特殊转义符\x十六进制数字:

  print(b \ xff [0])print(b \ x24 )255 b $ 反过来,我们也可以将数字(0~255)转换成转义字节类型:

  print(bytes([24]))print(bytes([36,36,36])#记住字节类型是序列b \ x18 b $ $ 或者直接从十六进制派生:

  print(bytes . from hex( 7b 7d )#逆运算print (b {} )。hex ()) int (b 。hex(),base=16)b { } 7b 207d 32 encode string有一个decode方法,bytes有一个encode方法。这里简单看一下。对于给定的字符,我们可以通过编码得到它在编码表中的坐标(即码位),所以对一个字符的编码( ascii )操作就是找到它在ASCII中的位置:

  打印( $ )。encode (ASCII)) print ($ )。encode (ASCII) [0]) b $ 36也就是说,字符 $ (这是0x07中已经引入的Unicode编码字符)在ASCII中的位置是$(或36)。

  但是,如果我们用ASCII编码一些奇怪的字符,就会出现这种情况:

  snake=?Try: snake.encode (ASCII )除了unicode encoder as err:print(err)#正确的做法是用UTF-8编码,因为字符串是UTF-8 print(snake . encode())# utf-8默认情况下 ASCII 编解码器无法对位置0中的字符 \ u0001f40d 进行编码:序数不在范围内(128) b \ 0 \ x9f \ x90 \ x8d 所以我们得到了最常见的错误:序数不在范围内(128)。至于为什么是128,现在应该很好理解了吧!

  和字符串一样,字节类型是不可变的序列,而字节数组是字节的可变版本,它们的关系相当于列表和元组。

  ba=bytearray(b hello )ba[0:1]=b w print(ba)bytearray(b wello )是一个类似string的序列类型,byte和bytearray可用的方法也差不多,这里就不一一列举了。

  Summary byte(字节数组)是二进制数据的序列,其中每个元素由8位二进制组成,即1byte,即2位十六进制数,即0 ~ 255;

  它是字节计算机的语言,字符串是人类的语言,它们通过编码表形成一一对应。

  最小的ASCII编码表只需要一个字节,只占用[31127]个码位;

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: