97-数据读写和文件管理-数据读写基本类-字节数组QByteArray

字节数组QByteArray

在利用QIODevice 的子类进行读写数据时通常返回值或参数是 QByteArray类型的数据。

  • QByteArray 用于存储二进制数据,至于这些数据到底表示什么内容(字符串数字图片或音频等),完全由程序的解析方式决定。
  • 如果采用合适的字符编码方式(字符集),字节数组可以恢复成字符串,字符串也可以转换成字节数组。
  • 字节数组会自动添加"\0"作为结尾,统计字节数组的长度时,不包含末尾的0"。

用QByteArray创建字节数组的方法如下,其中c只能是一个字符,例如"a",size指c的个数,例如 QByteArray(5,a")表示"aaaaa"

from PySide6.QtCore import QByteArray

QByteArray(self)-> None
QByteArray(arg__1: bytearray)-> None
QByteArray(arg__1: bytes)-> None
QByteArray(arg__1: bytes,size: int = -1)-> None
QByteArray(arg__1: Union[PySide6.QtCore.QByteArray,bytes])-> None
QByteArray(size: int,c: int)-> None
  • 用Python的 str(QByteArrayencoding=“utf-8”)函数可以将 QByteArray 数据转换成Python的字符串型数据。
  • 用QByteArray 的append(str)方法可以将 Pthon 的字符串添加到QByteArray 对象中,同时返回包含字符串的新QByteArray 对象。

QByteArray的常用方法如表所示,一些需要说明的方法介绍如下:

  • QByteArray 对象用resize(size:int)方法可以调整数组的尺寸
  • 用size()方法可以获取字节数组的长度,用"[]"操作符或at(iint)方法读取数据。
  • 用append(Union[QByteArray,bytes])或 append(c:str)方法可以在末尾添加数据,
  • 用prepend(Union[QByteArraybytes])方法可以在起始位置添加数据
  • 用静态方法 fromBase64(Union[QByteArray,bytes],options = QByteArray.Base64Encoding)可以把 Base64 编码数据解码
  • 用toBase64(options:QByteArray.Base64Option)方法可以转换成 Base64 编码其中参数options 可以取:
    • QByteArray.Base64UrlEncoding
    • QByteArray.KeepTrailingEqualsBase64Encoding
    • QByteArray.QByteArray. OmitTtailingEquals
    • QByteArray.IgnoreBase64DecodingErrors
    • QByteArray.AbortOnBase64DecodingErrors。
  • 用setNum(float,format=‘g’,precision=6)方法或 number(float,format='gprecision=6)方法可以将浮点数转换成用科学计数法表示的数据
    • 其中格式format可以取eEfgG
      • ``e表示的格式如[-]9.9e[+ | -]999`
      • E表示的格式如[-]9.9E[+ | -]999
      • f表示的格式如[-]9.9
      • g表示视情况选择ef
      • G表示视情况选择WF
字节数组QByteArray介绍

QByteArray可用于存储原始字节(包括"\0")和传统的8位"\0"终止字符串。使用QByteArray比使用const char要方便得多。在后台,它总是确保数据后面跟着一个"\0"终止符,并使用隐式共享(写时复制)来减少内存使用,避免不必要的数据复制。
除了QByteArray,Qt还提供了用于存储字符串数据的QString类。对于大多数目的,QString是您想要使用的类。它将其内容理解为Unicode文本(使用UTF-16编码),其中QByteArray旨在避免对其存储的字节的编码或语义进行假设(除了少数使用ASCII的遗留情况)。此外,QString在Qt API中始终使用。QByteArray适用的两种主要情况是,当您需要存储原始二进制数据时,以及当内存节约至关重要时(例如,使用Qt for Embedded Linux)。
初始化QByteArray的一种方法是简单地将const char
传递给它的构造函数。例如,以下代码创建一个大小为5的字节数组,其中包含数据"Hello":

ba = QByteArray("Hello")

尽管size()是5,但字节数组在末尾还保留了一个额外的"\0"字节,因此,如果使用一个函数来请求指向底层数据的指针(例如,对data()的调用),则所指向的数据保证是"\0"终止的。
QByteArray对const char*数据进行深度复制,因此您可以稍后对其进行修改,而不会出现副作用。(例如,出于性能原因,如果您不想获取数据的深层副本,请使用fromRawData()。)
另一种方法是使用resize()设置数组的大小,并逐字节初始化数据。QByteArray使用基于0的索引,就像C++数组一样。要访问特定索引位置的字节,可以使用运算符。在非常量字节数组中,运算符返回对可在赋值左侧使用的字节的引用。例如:

ba = QByteArray()
ba.resize(5)
ba[0] = 0x3c
ba[1] = 0xb8
ba[2] = 0x64
ba[3] = 0x18
ba[4] = 0xca

对于只读访问,另一种语法是使用at():

for i in range(0,ba.size()):
    if ba.at(i)>= 'a'and ba.at(i)<= 'f':
        print("Found character in range [a-f]")

at()可以比运算符更快,因为它永远不会导致深度复制。
要一次提取多个字节,请使用first()、last()或sliced()。
QByteArray可以嵌入"\0"个字节。size()函数总是返回整个数组的大小,包括嵌入的"\0"字节,但不包括QByteArray添加的终止"\0"。例如:

ba1 = QByteArray("ca\0r\0t")
ba1.size()# Returns 2.
ba1.constData()# Returns"ca"with terminating \0.
ba2 = QByteArray("ca\0r\0t",3)
ba2.size()# Returns 3.
ba2.constData()# Returns"ca\0"with terminating \0.
ba3 = QByteArray("ca\0r\0t",4)
ba3.size()# Returns 4.
ba3.constData()# Returns"ca\0r"with terminating \0.
cart = {'c','a','\0','r','\0','t'}
ba4 = QByteArray(QByteArray.fromRawData(cart,6))
ba4.size()# Returns 6.
ba4.constData()# Returns"ca\0r\0t"without terminating \0.

如果要获取不超过第一个"\0"字节的数据长度,请对字节数组调用qstrlen()。
在调用resize()之后,新分配的字节具有未定义的值。要将所有字节设置为特定值,请调用fill()。
要获得指向实际字节的指针,请调用data()或constData()。这些函数返回一个指向数据开头的指针。在QByteArray上调用一个非常数函数之前,指针保证保持有效。还可以保证数据以"\0"字节结束,除非QByteArray是从原始数据创建的。此"\0"字节由QByteArray自动提供,不计入size()。
QByteArray提供了以下修改字节数据的基本函数:append()、prepend()、insert()、replace()和remove()。例如:

x = QByteArray("and")
x.prepend("rock")# x =="rock and"
x.append("roll")# x =="rock and roll"
x.replace(5,3,"")# x =="rock  roll"

在上面的例子中,replace()函数的前两个参数是开始替换的位置和应该替换的字节数。
当数据修改函数增加数组的大小时,它们可能会导致QByteArray对象的内存重新分配。当这种情况发生时,QByteArray的扩展量超过了它立即需要的数量,以便在阵列大小大幅增加之前有空间进行进一步扩展,而无需重新分配。
insert()、remove()和用不同大小的子数组替换子数组时,replace()函数对于大型数组来说可能很慢(线性时间),因为它们需要将数组中的许多字节移动至少一个内存位置。
如果您正在逐步构建QByteArray,并且提前知道QByteArray将包含大约多少字节,则可以调用reserve(),要求QByteArray预先分配一定量的内存。您也可以调用capacity()来了解QByteArray实际分配了多少内存。
请注意,由于隐式共享,使用非常数运算符和函数可能会导致QByteArray对数据进行深度复制。
QByteArray提供STL风格的迭代器(const_iterator和迭代器)。在实践中,迭代器在使用C++标准库提供的通用算法时很方便。

  • 迭代程序和对单个QByteArray元素的引用存在稳定性问题。当调用QByteArray修改操作(例如insert()或remove())时,它们通常会失效。当需要稳定性和类似迭代器的功能时,应该使用索引而不是迭代器,因为它们不与QByteArray的内部状态绑定,因此不会失效。
  • 当调用QByteArray的任何非常量方法时,不能依赖QByteArray上的迭代器以及对其中单个字节的引用来保持有效。在调用非常量方法之后访问这样的迭代器或引用会导致未定义的行为。当类似迭代器的功能需要稳定性时,您应该使用索引而不是迭代器,因为它们不与QByteArray的内部状态绑定,因此不会失效。

如果您想在QByteArray中查找特定字节或字节序列的所有出现,请使用indexOf()或lastIndexOf(()。前者从给定的索引位置开始向前搜索,后者向后搜索。如果两者都找到了字节序列的索引位置,则返回该索引位置;否则,返回-1。例如,这里有一个典型的循环,用于查找特定字符串的所有出现:

ba = QByteArray("We must be,very")
j = 0
while(j = ba.indexOf("<b>",j))!= -1:
    print("Found <b> tag at index position",j)
    j = j + 1

如果您只是想检查QByteArray是否包含特定的字节序列,请使用contains()。如果您想知道一个特定的字节序列在字节数组中出现了多少次,请使用count()。如果要用另一个值替换所有出现的特定值,请使用两个参数replace()重载之一。

QByteArray可以使用重载运算符进行比较,如运算符<()、运算符<=()、操作符==()、算子>=()等。这种比较完全基于字节的数值,速度非常快,但不是人类所期望的。localeAwareCompare()是对用户界面字符串进行排序的更好选择。

由于历史原因,QByteArray区分空字节数组和空字节数组。null字节数组是使用QByteArray的默认构造函数或通过向构造函数传递(const char*)0来初始化的字节数组。空字节数组是指大小为0的任何字节数组。空字节数组总是空的,但空字节数组不一定是空的:

QByteArray().isNull()# returns true
QByteArray().isEmpty()# returns true
QByteArray("").isNull()# returns false
QByteArray("").isEmpty()# returns true
QByteArray("abc").isNull()# returns false
QByteArray("abc").isEmpty()# returns false

除了isNull()之外的所有函数都将空字节数组视为空字节数组。例如,对于空字节数组,data()返回一个指向"\0"字节的有效指针(而不是nullptr),QByteArray()与QByteArray相比(“”)相等。我们建议您始终使用isEmpty()并避免使用isNull()。

最大大小和内存不足情况

QByteArray的最大大小取决于体系结构。大多数64位系统可以分配超过2GB的内存,通常限制为2^63字节。实际值还取决于管理数据块所需的开销。因此,您可以预期32位平台上的最大大小为2 GB减去开销,64位平台上为2^63字节减去开销。可以存储在QByteArray中的元素数量就是这个最大大小。
当内存分配失败时,如果使用异常支持编译应用程序,QByteArray将抛出std::bad_alloc异常。Qt容器中内存不足的情况是Qt将抛出异常的唯一情况。如果禁用了异常,则内存不足是未定义的行为。
请注意,操作系统可能会对持有大量已分配内存的应用程序施加进一步的限制,尤其是大型连续块。此类注意事项、此类行为的配置或任何缓解措施都不在QByteArray API的范围内。

C语言环境和ASCII函数

QByteArray通常将数据处理为字节,而不假定任何语义;在假定语义的情况下,它使用C语言环境和ASCII编码。QString支持标准Unicode编码,也可以使用QStringEncoder和QStringDecoder支持其他编码转换为Unicode。对于特定于语言环境的文本解释,请使用QLocale或QString。

C字符串

传统的C字符串,也被称为以"\0"结尾的字符串,是由一个起点指定的字节序列,隐式地包括每个字节,直到但不包括其后的第一个"\0"字节。接受这样一个没有长度的指针的方法将把它解释为这个字节序列。根据构造,这样的序列不能包含"\0"字节。
其他重载接受一个开始指针和一个字节计数;它们使用给定数量的字节,跟在起始地址后面,而不管其中是否有"\0"字节。在某些情况下,如果没有只使用指针的重载,则传递-1的长度将导致该方法使用指针后第一个"\0"字节的偏移量作为长度;只有当方法明确表示要这样做时(在这种情况下,它通常是默认参数),才应该传递-1的长度。

间距字符

一个常见的要求是从字节数组中删除间距字符(‘\n’、‘\t’、''等)。如果您想从QByteArray的两端删除间距,请使用trimmed()。如果您还想用字节数组中的单个空格字符替换每一个空格字符,请使用simplified()。出于这些目的,只能识别ASCII间隔字符。

数字字符串转换

执行数字数据类型和字符串表示形式之间转换的函数是在C语言环境中执行的,而与用户的语言环境设置无关。使用QLocale在数字和字符串之间执行区域设置转换。

字符大小写

在QByteArray中,大小写和大小写独立比较的概念仅限于ASCII。非ASCII字符被视为无大小写字符,因为它们的大小写取决于编码。这会影响支持不区分大小写选项或更改参数大小写的函数。受此影响的函数包括compare()、isLower()、is Upper()、to Lower(和to Upper(。
此问题不适用于QString,因为它们使用Unicode表示字符。

字节数组QByteArray方法
PySide6.QtCore.QByteArray的方法及参数类型返回值的类型说明
append(count:qsizetype,c:char)PySide6.QtCore.QByteArray这是一个重载函数。
将字节ch的计数副本追加到此字节数组,并返回对此字节数组的引用。
如果计数为负数或零,则不会向字节数组追加任何内容。
append(s:str,len:qsizetype)PySide6.QtCore.QByteArray这是一个重载函数。
将从str开始的第一个len字节追加到此字节数组,并返回对此字节数组的引用。附加的字节可能包括"\0"个字节。
如果len为负数,则str将被假定为以"\0"结尾的字符串,并且要复制的长度将使用qstrlen()自动确定。
如果len为零或str为null,则不会向字节数组追加任何内容。确保len不长于str。
append(PySide6.QtCore.QByteArray)PySide6.QtCore.QByteArray将字节数组ba追加到此字节数组的末尾。
例子:
x = QByteArray(“free”)
y = QByteArray(“dom”)
x.append(y)
# x ==“freedom”
这与insert(size(),ba)相同。
注意:QByteArray是一个隐式共享类。因此,如果你附加到一个空的字节数组,那么字节数组将只共享ba中保存的数据。在这种情况下,不需要复制数据,需要恒定的时间。如果共享实例被修改,它将被复制(写时复制),占用线性时间。
如果附加到的字节数组不是空的,则执行数据的深度复制,占用线性时间。
append()函数通常非常快(恒定时间),因为QByteArray在数据末尾预先分配了额外的空间,所以它可以在每次不重新分配整个数组的情况下增长。
append(c:char)PySide6.QtCore.QByteArray这是一个重载函数。
将字节ch追加到此字节数组。
append(a:QByteArrayView)PySide6.QtCore.QByteArray这是一个重载函数。
将数据追加到此字节数组。
at(i:int)str返回字节数组中索引位置i处的字节。
i必须是字节数组中的有效索引位置(即0<=i<size())。
back()str返回字节数组中的最后一个字节。与(size()-1)处相同。
提供此功能是为了与STL兼容。
capacity()qsizetype返回在不强制重新分配的情况下可以存储在字节数组中的最大字节数。
此功能的唯一目的是提供一种微调QByteArray内存使用情况的方法。通常,您很少需要调用此函数。如果您想知道字节数组中有多少字节,请调用size()。
cbegin()str返回指向字节数组中第一个字节的const STL样式迭代器。
cend()str返回一个常量STL样式迭代器,该迭代器正好指向字节数组中的最后一个字节之后。
chop(n:int)None从字节数组的末尾删除n个字节。
如果n大于size(),则结果是一个空字节数组。
例子:
ba = QByteArray(“STARTTLS\r\n”)
ba.chop(2)# ba ==“STARTTLS”
chopped(len:int)PySide6.QtCore.QByteArray返回一个字节数组,该数组包含此字节数组中最左边的size()-len字节。
clear()bool清除字节数组的内容并使其为null。
compare(a:QByteArrayView[,cs:PySide6.QtCore.Qt.CaseSensitivity=Qt.CaseSensitive])int返回一个小于、等于或大于零的整数,具体取决于此QByteArray是在QByteArrayView bv之前、与之相同的位置还是在其之后排序。比较根据区分大小写cs执行。
contains(bv:QByteArrayView)bool如果此字节数组包含bv查看的字节序列的出现,则返回true;否则返回false。
contains(c:char)bool这是一个重载函数。
如果字节数组包含字节ch,则返回true;否则返回false。
count()qsizetype获取长度,请改用size()或length()。
这是一个重载函数。
count(QByteArrayView)qsizetype返回bv在此字节数组中查看的字节序列的出现次数(可能重叠)。
count(char)qsizetype这是一个重载函数。
返回字节数组中字节ch的出现次数。
size()qsizetype返回此字节数组中的字节数。
字节数组中的最后一个字节位于size()-1的位置。此外,QByteArray确保size()位置的字节始终为"\0",这样您就可以使用data()和constData()的返回值作为期望以"\0"结尾的字符串的函数的参数。如果QByteArray对象是从不包括尾部"\0"终止字节的原始数据创建的,那么除非创建深度副本,否则QByteArray不会自动添加它。
ba = QByteArray(“Hello”)
n = ba.size()# n == 5
ba.data()[0] # returns ‘H’
ba.data()[4] # returns ‘o’
ba.data()[5] # returns ‘\0’
length()qsizetype与size()相同。
data()str获取字节串,这是一个重载函数。
endsWith(char)bool这是一个重载函数。
如果此字节数组以字节char结尾,则返回true;否则返回false。
endsWith(QByteArrayView)bool如果此字节数组以QByteArrayView查看的字节序列结束,则返回true;否则返回false。
例子:
url = QByteArray(“http://qt-project.org/doc/qt-5.0/qtdoc/index.html”)
if url.endsWith(“.html”):
first(n:qsizetype)PySide6.QtCore.QByteArray返回字节数组的前n个字节。
x = QByteArray(“Pineapple”)
y = x.first(4)
# y ==“Pine”
erase(first:str,last:str)char
erase(it:str)char从字节数组中删除由它表示的字符。将迭代器返回到已擦除字符之后的字符。
QByteArray ba =“abcdefg”;
auto it = ba.erase(ba.cbegin()); // ba is now"bcdefg"and it points to"b"
startsWith(Union[PySide6.QtCore.QByteArray,bytes])bool获取起始是否是指定的字节数组
fill(char,size:qsizetype=-1)PySide6.QtCore.QByteArray将字节数组中的每个字节都设置为ch。如果大小不同于-1(默认值),则会事先将字节数组的大小调整为大小。
ba = QByteArray(“Istambul”)
ba.fill(‘o’)
# ba ==“oooooooo”
ba.fill(‘X’,2)
# ba ==“XX”
[static]fromBase64(Union[PySide6.QtCore.QByteArray,bytes],options=PySide6.QtCore.QByteArray.Base64Encoding)PySide6.QtCore.QByteArray使用选项定义的选项返回Base64数组Base64的解码副本。如果选项包含IgnoreBase64DecodingErrors(默认值),则不检查输入的有效性;将跳过输入中的无效字符,从而使解码过程能够继续使用后续字符。如果选项包含AbortOnBase64解码错误,则解码将在第一个无效字符处停止。
例如:
在RFC 4648中定义了用于解码Base64编码数据的算法。
返回解码的数据,或者,如果传递了AbortOnBase64DecodingErrors选项并且输入数据无效,则返回空字节数组。
[static]fromBase64 Encoding(Union[bytes,PySide6.QtCore.QByteArray],options)PySide6.QtCore.QByteArray从Base64编码中解码
[static]fromHex(Union[PySide6.QtCore.QByteArray,bytes])PySide6.QtCore.QByteArray从十六进制数据中解码
[static]fromPercentEncoding(Union[PySide6.QtCore.QByteArray,bytes].percent: str=‘%’)PySide6.QtCore.QByteArray从百分号编码中解码
[static]fromRawData(data:bytes,size: int)PySide6.QtCore.QByteArray用前size个原生字节构建字节数组
front()char返回字节数组中的第一个字节。与(0)处相同。
提供此功能是为了与STL兼容。
indexOf(Union[PySide6.QtCore.QByteArray,bytes],from_ =0)int返回bv在此字节数组中查看的字节序列第一次出现的起始处的索引位置,从中的索引位置向前搜索。如果未找到匹配项,则返回-1。
例子:
x = QByteArray(“sticky question”)
y = QByteArrayView(“sti”)
x.indexOf(y)# returns 0
x.indexOf(y,1)# returns 10
x.indexOf(y,10)# returns 10
x.indexOf(y,11)# returns -1
indexO{(str,from_:int=0)int获取索引
insert(int,Union[PySide6.QtCore.QByteArray,bytes])PySide6.QtCore.QByteArray在字节数组的索引位置i处插入字节ch的计数副本。
此阵列会增长以适应插入。如果i超出了数组的末尾,则首先用空格字符扩展数组以达到这个i。
insert(i: int,c: str)PySide6.QtCore.QByteArray在指定位置插人文本数据
insert(i:int,count:int,c:str)PySide6.QtCore.QByteArray同上,count是指数据的份数
isEmpty()bool如果字节数组的大小为0,则返回true;否则返回false。
例子:
QByteArray().isEmpty()# returns true
QByteArray(“”).isEmpty()# returns true
QByteArray(“abc”).isEmpty()# returns false
isNull()bool如果此字节数组为null,则返回true;否则返回false。
QByteArray().isNull()# returns true
QByteArray(“”).isNull()# returns false
QByteArray(“abc”).isNull()# returns false
由于历史原因,Qt对空字节数组和空字节数组进行了区分。对于大多数应用程序来说,重要的是字节数组是否包含任何数据,这可以使用isEmpty()来确定。
isLower()bool如果此字节数组是小写的,也就是说,如果它与toLower()折叠相同,则返回true。
请注意,这并不意味着字节数组只包含小写字母;只是它不包含ASCII大写字母。
isUpper()bool如果此字节数组是大写的,也就是说,如果它与toUpper()折叠相同,则返回true。
请注意,这并不意味着字节数组只包含大写字母;只是它不包含ASCII小写字母。
isValidUtf8()bool如果此字节数组包含有效的UTF-8编码数据,则返回true,否则返回false。
last(n:qsizetype)PySide6.QtCore.QByteArray返回字节数组的最后n个字节。
x = QByteArray(“Pineapple”)
y = x.last(5)
# y ==“apple”
lastIndexOf(Union[PySide6.QtCore.QByteArray,bytes],from_=-1)int返回此字节数组中最后一次出现的字节ch的起始处的索引位置,从索引位置向后搜索。如果from为-1(默认值),则搜索从最后一个字节开始(索引大小()为-1)。如果未找到匹配项,则返回-1。
例子:
ba = QByteArray(“ABCBA”)
ba.lastIndexOf(“B”)# returns 3
ba.lastIndexOf(“B”,3)# returns 3
ba.lastIndexOf(“B”,2)# returns 1
ba.lastIndexOf(“X”)# returns -1
lastIndexOf(bv:QByteArrayView)qsizetype这是一个重载函数。
返回bv在此字节数组中查看的字节序列的最后一次出现的起始处的索引位置,从字节数组的末尾向后搜索。如果未找到匹配项,则返回-1。
例子:
x = QByteArray(“crazy azimuths”)
y = QByteArrayView(“az”)
x.lastIndexOf(y)# returns 6
x.lastIndexOf(y,6)# returns 6
x.lastIndexOf(y,5)# returns 2
x.lastIndexOf(y,1)# returns -1
left(len:qsizetype)PySide6.QtCore.QByteArray返回一个字节数组,该数组包含此字节数组的第一个len字节。
如果您知道len不能越界,请在新代码中使用first(),因为它更快。
如果len大于size(),则返回整个字节数组。
如果len小于0,则返回一个空的QByteArray。
leftJustified(width:qsizetype[,fill:char=‘’[,truncate:bool=false]])PySide6.QtCore.QByteArray返回一个大小为宽度的字节数组,该数组包含用填充字节填充的字节数组。
如果truncate为false,并且字节数组的size()大于width,则返回的字节数组是此字节数组的副本。
如果truncate为true,并且字节数组的size()大于width,则删除字节数组副本中位置width之后的任何字节,并返回该副本。
例子:
x = QByteArray(“apple”)
y = x.leftJustified(8,‘.’)# y ==“apple…”
mid(int,length=-1)PySide6.QtCore.QByteArray从指定位置获取指定长度的数据
[static]number(float,format=‘g’,precision=6)PySide6.QtCore.QByteArray将浮点数转换成科学计数法数据
[static]number(int,base=10)PySide6.QtCore.QByteArray将整数转换成base进制数据
prepend(Union[PySide6.QtCore.QByteArray,bytes])PySide6.QtCore.QByteArray在起始位置添加数据
remove(index:int,len:int)PySide6.QtCore.QByteArray从指定位置移除指定长度的数据
repeated(times: int)PySide6.QtCore.QByteArray获取重复times次后的数据
replace(index: int,len: int,Union[PySide6.QtCore.QByteArray,bytes])PySide6.QtCore.QByteArray从指定位置用数据替换指定长度 数据
replace(before: Union[PySide6.QtCore.QByteArray,bytes],after: Union[PySide6.QtCore.QByteArray,bytes])PySide6.QtCore.QByteArray用数据替换指定的数据
resize(size:int)None调整长度,如果长度小于现有长度,则后面的数据会被丢弃
setNurn(float,format=‘g’,precision=6)PySide6.QtCore.QByteArray将浮点数转换成科学计数法数据
setNum(int,base=10)PySide6.QtCore.QByteArray将整数转换成指定进制的数据
split(sep:str)ListCPySide6.QtCore.QByteArrayJ用分割符将字节数组分割成列表
squeeze()None释放不存储数据的内存

静态方法介绍:

  • fromBase64(base64[,options=QByteArray.Base64Option.Base64Encoding])

    PARAMETERS:

    RETURN TYPE:

    PySide6.QtCore.QByteArray

    使用选项定义的选项返回Base64数组Base64的解码副本。如果选项包含IgnoreBase64DecodingErrors(默认值),则不检查输入的有效性;将跳过输入中的无效字符,从而使解码过程能够继续使用后续字符。如果选项包含AbortOnBase64解码错误,则解码将在第一个无效字符处停止。
    例如:

    text = QByteArray.fromBase64("UXQgaXMgZ3JlYXQh")
    text.data()# returns"Qt is great!"
    QByteArray.fromBase64("PHA+SGVsbG8/PC9wPg==",QByteArray.Base64Encoding)# returns"<p>Hello?</p>"
    QByteArray.fromBase64("PHA-SGVsbG8_PC9wPg==",QByteArray.Base64UrlEncoding)# returns"<p>Hello?</p>"
    

    在RFC 4648中定义了用于解码Base64编码数据的算法。
    返回解码的数据,或者,如果传递了AbortOnBase64DecodingErrors选项并且输入数据无效,则返回空字节数组。

  • fromBase64Encoding(base64[,options=QByteArray.Base64Option.Base64Encoding])

  • fromHex(hexEncoded)

    返回十六进制编码数组hexEncoded的解码副本。未检查输入的有效性;将跳过输入中的无效字符,从而使解码过程能够继续使用后续字符。
    例如:

    text = QByteArray.fromHex("517420697320677265617421")
    text.data()# returns"Qt is great!"
    
  • fromPercentEncoding(pctEncoded[,percent=‘%’])

    • PARAMETERS:

      pctEncodedPySide6.QtCore.QByteArraypercentchar

    • RETURN TYPE:

      PySide6.QtCore.QByteArray
      解码来自URI/URL样式百分比编码的输入。
      返回一个包含解码文本的字节数组。percent参数允许使用不同于"%“的字符(例如”_“或”=")作为转义符。相当于输入。解码百分比(百分比)。
      例如:

      text = QByteArray.fromPercentEncoding("Qt%20is%20great%33")
      qDebug("%s",text.data())# reports"Qt is great!"
      
  • fromRawData(data,size)

    构造一个QByteArray,该数组使用数据数组的第一个大小字节。字节不会被复制。QByteArray将包含数据指针。调用方保证,只要存在此QByteArray及其任何未经修改的副本,数据就不会被删除或修改。换句话说,因为QByteArray是一个隐式共享类,并且此函数返回的实例包含数据指针,所以只要返回的QByteArray和任何副本存在,调用方就不能删除数据或直接修改数据。然而,QByteArray并不拥有数据的所有权,因此QByteArray析构函数永远不会删除原始数据,即使引用数据的最后一个QByteArray被销毁。
    随后尝试修改返回的QByteArray的内容或从中生成的任何副本,将导致它在进行修改之前创建数据阵列的深度副本。这确保了原始数据数组本身永远不会被QByteArray修改。
    以下是如何在不将原始数据复制到QByteArray的情况下,使用QDataStream读取内存中的原始数据的示例:

     mydata = {
        '\x00','\x00','\x03','\x84','\x78','\x9c','\x3b','\x76',
        '\xec','\x18','\xc3','\x31','\x0a','\xf1','\xcc','\x99',
        ...
        '\x6d','\x5b'
    
    data = QByteArray.fromRawData(mydata,sizeof(mydata))
    in = QDataStream(data,QIODevice.ReadOnly)
    ...
    

    使用fromRawData()创建的字节数组不是以"\0"结尾的,除非原始数据包含位置大小为"\0"的字节。虽然这对QDataStream或indexOf()等函数来说并不重要,但将字节数组传递给接受预期为"\0"终止的const char*的函数将失败。

  • fromStdString(s)

    以QByteArray的形式返回str字符串的副本。

Python3中新添加了字节串 bytes 数据类型其功能与QByteArray的功能类似。

如果一个字符串前面加b,就表示是 bytes类型的数据例如 b"hello"

bytes 数据和字符串的对比如下:

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

  • 字符串由若干个字符组成,以字符为单位进行操作;bytes 由若干个字节组成,以字节为单位进行操作。

  • bytes 和字符申除了操作的数据单元不同之外,它们支持的所有方法都基本相同。

  • bytes 和字符串都是不可变序列,不能随意增加和删除数据

  • 用xx=bytes(“hello”,encoding=‘ut-8’)方法可以将字符"hello"转换成bytes

  • 用yy=str(xx,encoding='utf-8)方法可以将 bytes 转换成字符串。

  • bytes 也是一个类用bytes()方法可以创建一个空 bytes 对象,

    • 用bytes(int)方法可以创建指定长度的 bytes 对象,
    • 用decode(encoding=‘utf-8’)方法可以对数据进行解码,bytes 的操作方法类似于字符串的操作方法。
  • Python中还有一个与 bytes类似但是可变的数组 bytearray;

    • 其创建方法和字符串的转换方法与bytes相同,在 QByteArray 的各个方法中可以用bytes 数据的地方也可以用bytearrayo
  • bytes 数据和QByteArray 数据非常适合在互联网上传输,可以用于网络通信编程bytes 和QByteArray 都可以用来存储图片音视频等二进制格式的文件。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日,当挖目相待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值