返回顶部
首页 > 资讯 > 后端开发 > Python >python数据类型bytes 和 bytearray的使用与区别
  • 927
分享到

python数据类型bytes 和 bytearray的使用与区别

2024-04-02 19:04:59 927人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录bytes 和 bytearray理解bytes 和 bytearraypython中值的表示进制转换bytes类型bytes类型转化bytes转数值bytes的方法bytear

bytes 和 bytearray

bytes 和 bytearray 都是二进制世界的成员,用二进制的方式去理解才能看清他的本质。

理解bytes 和 bytearray

0 和 1 是计算机工作的根本,单个的0和1只能表达两种状态,无法满足我们复杂的计算,于是计算机使用了8位即一个byte作为一个储存的基本单位。

byte 由 8bit 组成,例如   0000 0001  , 也可以表示为16进制的形式:0x01, 0x为固定前缀,表示该数使用16进制表示方式,此外0o前缀为8进制,0b为二进制形式,以此区分。bytes 从字面上理解是byte 的复数, 也就是多个byte组成的序列。这一点与字符串与字符的关系类似。

于是,我们可以这样理解,字符串是由一个个字符顺序储存组成的序列,其中每个元素为一个字符。bytes 是由一个个byte组成的序列,每一个元素是一个byte。

bytearray是一个由byte为元素组成的array,其中每一个元素为一个byte。在Python官方文档中,作者简单的定义了这两个类型。翻译

bytes:可以看作是一组二进制数值(0-255) 的 str 序列bytearray :可以看作是一组二进制数值(0-255) 的 list 序列

python中值的表示

在计算机中表示数有多种表示方式,普通的表示方式就是10进制的数值表示方法,例如a=10,此外还有8进制,16进制,2进制的表示方式,分别使用前缀0o和0x和0b表示。

a = 97
a = 0b01100001
a = 0x61
a = 0o301

使用上面4种方式定义的值均为十进制数97,也就是上面四种方式是等价得,只是使用不同的进制表示同一个值。

除了使用数值可以有不同的表示方式外,还可以使用字节的方式来定义一个值,而字节该如何书写?python使用了一个特殊字符串来表示字节,这个特殊字符可以使用前缀\x,\o, \b和\ 表示,分别表示16,8,2,10进制的表示方式,特殊字符后是对应的进制表示值。示例

a = "a"
a = "\b01100001"
a = "\x61"
a = "\o301"

同样得,这样得四种方式是等价得,a变量的值均为"a"。以上是单字节的字符的表示,多字节字符或者是一个字符串同样可以如此定义。

#  使用encode查看一下中国的二进制编码为

str.encode("中国")     #  ==>   b'\xe4\xb8\xad\xe5\x9b\xbd',前缀 b表示该值的类型为bytes,区别于字符串的表示

#  因此,我们可以使用这个字节表示来定义“中国”

a = '\xe4b8ade59bbd'    # 或者 '\xe4\xb8\xad\xe5\x9b\xbd',两种方式均可

# 其8进制可以如此计算
num = int.from_bytes(a, "big")    # 将这段字符串转化为内存等值的数值
print(oct(num))                   # 打印该数值的8进制表示,结果为字符串类型。在该字符串加上\o前缀即可

# 最后打印结果
print(a)    # ==> "中国"

# 再假如我们需要定义一个字符串abc,可以使用下面的方式

a = "abc"

a = "\x616263"        # 由于abc的ascii码分别为 0x61 62 63
a = "\o301302303"       # 由于abc的ascii码分别为 0o301 302 303
a = "\979899"          # 由于abc的ascii码分别为 979899

进制转换

字节,数值,字符等类型可以使用下面的方式进行转化。还包括值得不同进制表示,字符串得不同进制表示,示例:

# 内置函数
chr(97)      #    ==> "a"
ord("a")     #    ==> 97

# 将一个10进制数,转化为其他进制的数的字符串表示得内置函数,注意,结果都是字符串,而不是对应进制的数值
bin(97)                                 # ==> '0x61'
oct(97)                                 # 8进制字符 '0o301'
hex(97)                                # 2进制字符 '0b01100001'

# 也可使用fORMat完成
#带前缀 0x 
format(97,"#x")                                   # ==> '0x61'
format(97,"#o")                                   # 8进制字符 '0o301'
format(97,"#b")                                   # 2进制字符 '0b01100001'
#不带前缀
format(97,"X")                                    # ==> '61'
format(97,"o")                                    # ==> '301'
format(97,"b")                                    # ==> '01100001'

# 3.6+版本使用方法
# f'{255:X}' 和 f'{255:#X}'                   ===> " FF "  和 "0xFF"

# 使用c 风格得表示
"%x"%10                                     # ==> 'a'
"%o"%10                                     # ==> '12'
# 带前缀                               
"%#x"%10                                     # ==> '0xa'
"%#o"%10                                     # ==> '0o12'

将一个字节或者字符或者字符串转化为值类型可以使用如下的方式。

ord("a")          # ==> 97
int.from_bytes(b"a", "big")    # 97 类型为int,指定大端模式(小地址存多字节高位)

# 以下两种形式等价
int.from_bytes(b"abc", "big")              #   ==> 得到三字节长度的数值 
int.from_bytes(bytes("abc"), "big")      #

bytes类型

将一个str 转化为 bytes 的本质是将str中的每个字符转化为该字符的二进制编码形式。例如 a 的二进制为 0x65。

# 将字符串abc 中每一个字符转化为二进制编码形式就是bytes类型
s = "abc"
bs1 = bytes("abc")         # bytes()第一个参数为一个可迭代对象,将每一个元素转为二进制的表示方式

print(s)          # 'abc'
print(bs1)       # b'abc'     python检测到这个二进制序列可以使用字符abc表示,但是为了区别于abc的字符串,所以使用 b'abc',只是给人看的一种表示结果。实际的值应该是一个个字节。

# 我们看一下单个元素
print(s[0])        #  'a'
print(bs1[0])     #  97  而不是 b'a',对于单个字节0x61, python使用了十进制数97表示

二进制类型bytes使用b'abc'的表示方式,只是尝试将这个序列中的元素翻译为人类可以看懂的形式,实际在变量内存中储存的为一个个二进制字节0x61 0x62 0x63,这样的三个字节可以根据数据类型的不同翻译成不同的结果。

b2 = bytes( [97,98,99] )
print(b2)     #  ==> b'abc'

这就对上面结论最佳证明,出现该结果的原因是,python中的列表 [97, 98, 99] 在内存中二进制储存和字符串abc储存的值是相同的,所以使用python来展示这段内存时,它使用b'abc'的方式进行展示。

bytes类型转化

字符串转bytes类型

# 将返回 bytes 类型 b" abc ", 可以添加encoding参数指定字符串的编码方式
bs1 = bytes("abc","utf-8")
# 可以使用字符的16进制字符表达形式
bs2 = bytes('\x61\x62\x63',"utf-8")
# 直接对字符进行编码成二进制形式
bs2 = "abc".encode()

# 16进制字符转为bytes类型
b1 = bytes.fromhex("61 62 63")  #  ==>   b"abc"   "61,62"是两个16进制数组合,单个值不能超过 7F也就是不能超过127 ,否则无法对应ASCII表中的字符
b1.hex()                 # ===>  '616263'   ASCII码中abc字符对应的16进制数组成的字符串,上面函数的逆运算。

数值转化为bytes类型

想要使用数值来定义一个不能直接使用 bytes(97) 的方式来定义,这不会在内存中储存一个二进制的 97,而是会开辟97个字节,每个字节的值为0x00。这是需要注意的一点,如果想要储存一个97,可以使用列表来实现。

# 传入数值类型可迭代对象
b1 = bytes(range(97,100))               #  ==> b'abc'
b2 = bytes([97,98,99])                   #  ==> b'abc'
b3 = bytes([97])                             #  ==> b'a'

# 直接传入10进制数值对象而不是可迭代对象,将会生成对应数值字节的空bytes
b4 = bytes(3)         #  b'\x00\x00\x00'   三个空字符的 bytes

# 通过数值转化将8进制,16进制数字 生成bytes对象
b5 = bytes([int("61",16)])    #16进制61  == > 10 进制 ==> bytes ==> b"a" (使用字符a表示)
b6 = bytes([int("61", 8)])     # 8进制61  == > 10 进制 ==> bytes  ==> b"1" (使用字符1表示)

#  也可利用bytes 对象转化为 10 进制 数值
num = int.from_bytes(b"abc","big")         # "abc"对应的三个字节拼接在一起作为一个二进制数,并计算为10进制数输出
print(num)                   #    ===>   6382179

以上是将数值和字符串转化为  字节类型,这是常用的类型转化方式,同样的,也可以将字节转化为字符或者值的类型。使用以下的方法即可

bytes转数值

bytes类型转化为 值类型使用 数值使用 int的一个类方法from_bytes即可,示例:

num = int.from_bytes(b“abc”, "big")    # 将这个bytes对象转化为内存等值的数值

bytes的方法

bytes对象的方法和字符串的方法基本一致,可以进行字符串的几乎所有操作,例如字符串的replace,split,partation等操作,唯一需要区别的是。字符串的操作操作的对象是一个字符串或者单个字符,而bytes对象操作的是一个bytes二进制字节,例如进行字符串替换时:

"abc".replace("a", "x")     # 将字符a 替换为 x

# 而在bytes对象

b"abc".replace(b"a", b"x")     # 无论是参数中的对象还是对象本身都是bytes类型,有b“”前缀标识

其他方法类比于str的方法,并结合官方文档即可。

bytearray

bytearray类似于中的list数据类型,bytearray中的每一个元素始终为一个字节值,也就是 0x00 - 0xff 区间的一个值,如果不在该范围内的值,在指定了编码方式的情况下可以按照字节遍历

初始化一个bytearray对象。同样需要一个可迭代对象作为参数,将会按照字节遍历整个可迭代对象,有以下的方式

bytearray("abc", encoding="utf-8")      # abc字符串使用utf-8的方式编码为字节,每个字节作为bytearray对象的一个元素储存即可。
bytearray(b"abc")                       # 也可以使用bytes 类型,而使用bytes类型就没有编码一说了
bytearray([97, 98, 99])                 # 使用可迭代对象,内部元素为一个一个0-255的数值类型。

ba1 = bytearray(range(97,103))          # 可迭代当然包括range对象
ba1                                     #  bytearay对象,==>  bytearray(b"abcdef")
ba1[0]                                  #  ==>  97  (integer)
ba1[1:4]                                #  切片 ==> bytearray(b'bcd')

# 赋值,可变 bytearray
ba[ 4 ] = 122                           #  122整型对应字符"z",   ==> b"e" --> b"z"
ba                                    #   bytearray(b"abcdzf" )
ba1[1:4] = b"xyz"                     # 切片赋值,替换ba1[1:4]的内容, 只有bytes 或bytearray 序列可赋值

bytes和bytearray类型之间可以直接进行转化,bytes()中可以传入一个bytearray对象作为参数,并且不存在编码问题,因为两个类型都是一个二进制的序列。

python在展示bytearray对象,使用的是bytesarray(b"abc") 的方式,其实,不妨理解为 bytearray( [ b"a",  b"b",  b"c" ] ) 的形式。也就是每个元素为字节列表。所以byteaarray实现了和列表对象的方法,并且可以进行元素的替换,也就是与列表相同,他是一个可变类型的对象。而bytes 与字符串都是不可变的,无法对单个元素进行替换,对象一旦产生将不可变。如果需要改变,需要新建一个新的对象。

bytearray的方法

类似与 列表对象,可以进行切片,append, extend,insert等操作,同样的,由于内部的元素都是一个个字节对象,对单个元素操作时只能操作单字节的对象,而执行extend这类处理可迭代对象方法,也要求可迭代对象内部的所有元素为单字节对象。单字节对象,可以是 b"a"类似的单字节对象  或  0-255的数值。因为一个字节只能储存256中状态。以下是几个简单的示例

a = bytearray(b"abc")

a.append(100)
print(a)             # bytearray(b"abcd")

a.append(b"e")
print(a)            # bytearray(b"abcde")

a.extend(a)       
print(a)            # bytearray(b"abcdeabcde")

a.insert(0, b"A")
print(a)            # bytearray(b"Aabcdeabcde")

bytes(a)           # b"Aabcdeabcde"

 到此这篇关于python数据类型bytes 和 bytearray的使用与区别的文章就介绍到这了,更多相关python bytes 和 bytearray内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python数据类型bytes 和 bytearray的使用与区别

本文链接: https://lsjlt.com/news/139427.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python数据类型bytes 和 bytearray的使用与区别
    目录bytes 和 bytearray理解bytes 和 bytearraypython中值的表示进制转换bytes类型bytes类型转化bytes转数值bytes的方法bytear...
    99+
    2024-04-02
  • js基本数据类型和引用数据类型的区别
    本篇内容主要讲解“js基本数据类型和引用数据类型的区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“js基本数据类型和引用数据类型的区别”吧!基本数据类型和引用...
    99+
    2024-04-02
  • 如何对python的bytes类型数据s
    对str类型数据进行split操作如下: >>> s = 'abc\ndef' >>> s.split('\n') ['abc', 'def'] 对bytes类型数据进行split操作如下: >...
    99+
    2023-01-31
    类型 数据 python
  • Python中bytes和str的区别与联系详解
    目录Bytes和Str的区别Bytes与Str间的转换读写文件的注意事项总结Bytes和Str的区别 在Python3中,字符序列有两种类型:bytes和str。bytes类型是无符...
    99+
    2024-04-02
  • python中可变数据类型和不可变数据类型有什么区别
    这篇文章将为大家详细讲解有关python中可变数据类型和不可变数据类型有什么区别,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、区别说明可变数据类型是当该数据类型对应变量的值发生变化时,对...
    99+
    2023-06-15
  • MySQL与Oracle的数据类型有什么区别
    这篇文章主要为大家展示了“MySQL与Oracle的数据类型有什么区别”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL与Oracle的数据类型有什么区别...
    99+
    2024-04-02
  • Python 面试高频问题:可变数据类型和不可变数据类型的区别
    Python可变数据类型和不可变数据类型是一个基础而且重要的考点。简单地说:这里的可变和不可变是指当变量改变的时候,数据的地址是否会改变!可变数据类型:如果改变了变量的值,相当于是新建了一个对象(即地址会被改变)。可变数据类型:变量的值发生...
    99+
    2023-05-19
    Python 可变数据类型 不可变数据类型
  • python数据类型判断type与isinstance的区别实例解析
    在项目中,我们会在每个接口验证客户端传过来的参数类型,如果验证不通过,返回给客户端“参数错误”错误码。 这样做不但便于调试,而且增加健壮性。因为客户端是可以作弊的,不要轻易相信客户端传过来的参数。 验证类...
    99+
    2022-06-04
    数据类型 实例 区别
  • Python中内置数据类型list,tuple,dict,set的区别和用法
    Python语言简洁明了,可以用较少的代码实现同样的功能。这其中Python的四个内置数据类型功不可没,他们即是list, tuple, dict, set。这里对他们进行一个简明的总结。 List 字面意...
    99+
    2022-06-04
    数据类型 区别 list
  • Java 框架中数据类型和接口的区别与联系。
    Java是一种功能强大的编程语言,它提供了许多不同的框架和库,使得开发人员可以快速地构建高效的应用程序。其中,数据类型和接口是Java开发中非常重要的两个概念。在本文中,我们将深入探讨Java框架中数据类型和接口的区别和联系。 首先,让我们...
    99+
    2023-10-13
    框架 数据类型 接口
  • golang函数类型的作用和区别
    go 语言中函数类型定义了函数调用的签名和参数类型,用于定义函数、声明接口和表示回调。函数类型分为普通函数类型和方法类型,分别用于定义普通函数和类型的方法。例如,普通函数类型可用于定义计...
    99+
    2024-04-28
    golang 函数类型
  • JavaScript 基本数据类型和引用类型的区别是怎么样的
    这篇文章将为大家详细讲解有关JavaScript 基本数据类型和引用类型的区别是怎么样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。js基本数据类型:js...
    99+
    2024-04-02
  • C#中值类型和引用类型的区别
    一、值类型和引用类型的区别 .NET的类型可以分为两类:值类型和引用类型。这两种类型各有特点,即使它们都继承自System.Object,并且有装箱和拆箱等操作确保两种类型可以方便地...
    99+
    2024-04-02
  • 关于js typeof 与 instanceof 判断数据类型区别及开发使用
    目录1、typeof 操作符2、instanceof 操作符3、typeof 和 instanceof 的区别以及开发中的使用建议前言: 日常的开发中,我们经常会遇到判断一个变量的数...
    99+
    2024-04-02
  • Python数据模型与对象模型的区别是什么
    这期内容当中小编将会给大家带来有关Python数据模型与对象模型的区别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。数据模型==对象模型Python官方文档说法是“Python数据模型”,大多数Py...
    99+
    2023-06-15
  • MySQL DATETIME 和 TIMESTAMP 数据类型有什么区别?
    两种数据类型都以“YYYY-MM-DD HH:MM:SS”格式存储数据,并包含日期和时间。尽管有这些相似之处,但它们还是有以下区别 -范围 - 日期时间数据类型支持 1000 之间的日期和时间-01-01 00:00:00 和 9999-1...
    99+
    2023-10-22
  • c#引用类型与值类型的区别是什么
    这篇文章主要讲解了“c#引用类型与值类型的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c#引用类型与值类型的区别是什么”吧!解析:CLR支持两种类型:值类型和引用类型。用Jeff...
    99+
    2023-06-17
  • Python变量和数据类型和数据类型的转换
    目录变量什么是变量?print语句格式变量的特征数据类型type()语句type()语句的使用方式1.在print语句中,直接输出类型信息2.用变量存储type()的结果(返回值)3...
    99+
    2024-04-02
  • Python变量与数据类型的原理和作用
    这篇文章主要介绍“Python变量与数据类型的原理和作用”,在日常操作中,相信很多人在Python变量与数据类型的原理和作用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python变量与数据类型的原理和作用...
    99+
    2023-06-15
  • Oracle中Blob和Clob数据类型的区别及用法介绍
    Oracle数据库中的Blob和Clob数据类型在存储大型数据对象时起着重要作用。Blob用于存储二进制数据,例如图片、音频或视频文件,而Clob用于文本数据,例如长文本、HTML页面...
    99+
    2024-03-08
    - oracle - blob - clob
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作