字节对象 — Python 文档

来自菜鸟教程
Python/docs/3.8/c-api/bytes
跳转至:导航、​搜索

字节对象

这些函数在需要字节参数时会引发 TypeError,并使用非字节参数调用。

type PyBytesObject
PyObject 的这个子类型表示 Python 字节对象。
PyTypeObject PyBytes_Type
PyTypeObject 的这个实例表示 Python 字节类型; 它与 Python 层中的 bytes 对象相同。
int PyBytes_Check(PyObject *o)
如果对象 o 是字节对象或字节类型的子类型的实例,则返回 true。
int PyBytes_CheckExact(PyObject *o)
如果对象 o 是字节对象,但不是字节类型的子类型的实例,则返回 true。
PyObject *PyBytes_FromString(const char *v)
返回一个新的字节对象,其中包含字符串 v 的副本作为成功时的值,失败时返回 NULL。 参数v不能是NULL; 它不会被检查。
PyObject *PyBytes_FromStringAndSize(const char *v, Py_ssize_t len)
返回一个新的字节对象,其中包含字符串 v 的副本作为值,成功时返回长度 len,失败时返回 NULL。 如果 vNULL,则字节对象的内容未初始化。
PyObject *PyBytes_FromFormat(const char *format, ...)

取一个 C printf() 样式的 format 字符串和可变数量的参数,计算生成的 Python 字节对象的大小并返回一个字节对象,其中包含格式化的值。 变量参数必须是 C 类型,并且必须与 format 字符串中的格式字符完全对应。 允许使用以下格式字符:

格式字符

类型

评论

%%

不适用

The literal % character.

%c

整数

单个字节,表示为 C int。

%d

整数

相当于 printf("%d")1

%u

无符号整数

相当于 printf("%u")1

%ld

相当于 printf("%ld")1

%lu

无符号长

相当于 printf("%lu")1

%zd

py_ssize_t

相当于 printf("%zd")1

%zu

尺寸_t

相当于 printf("%zu")1

%i

整数

相当于 printf("%i")1

%x

整数

相当于 printf("%x")1

%s

常量字符*

以空字符结尾的 C 字符数组。

%p

常量空*

C 指针的十六进制表示。 大部分等同于 printf("%p"),除了它保证以文字 0x 开头,而不管平台的 printf 产生什么。

无法识别的格式字符会导致格式字符串的所有其余部分按原样复制到结果对象,并丢弃任何额外的参数。

1(1,2,3,4,5,6,[ X67X]7,8)

对于整数说明符 (d, u, ld, lu, zd, zu, i, x):即使给定精度,0 转换标志也有效。

PyObject *PyBytes_FromFormatV(const char *format, va_list vargs)
PyBytes_FromFormat() 相同,只是它只需要两个参数。
PyObject *PyBytes_FromObject(PyObject *o)
返回实现缓冲协议的对象 o 的字节表示。
Py_ssize_t PyBytes_Size(PyObject *o)
返回字节对象 o 中的字节长度。
Py_ssize_t PyBytes_GET_SIZE(PyObject *o)
PyBytes_Size() 的宏形式,但没有错误检查。
char *PyBytes_AsString(PyObject *o)
返回指向 o 内容的指针。 指针指向o的内部缓冲区,由len(o) + 1字节组成。 缓冲区中的最后一个字节始终为空,无论是否有任何其他空字节。 不得以任何方式修改数据,除非对象是使用 PyBytes_FromStringAndSize(NULL, size) 创建的。 它不能被解除分配。 如果 o 根本不是字节对象,则 PyBytes_AsString() 返回 NULL 并引发 TypeError
char *PyBytes_AS_STRING(PyObject *string)
PyBytes_AsString() 的宏形式,但没有错误检查。
int PyBytes_AsStringAndSize(PyObject *obj, char **buffer, Py_ssize_t *length)

通过输出变量bufferlength返回对象obj的空终止内容。

如果 lengthNULL,bytes 对象可能不包含嵌入的空字节; 如果是,则函数返回 -1 并引发 ValueError

缓冲区指的是obj的内部缓冲区,它在末尾包含一个额外的空字节(不计入长度)。 不得以任何方式修改数据,除非对象是使用 PyBytes_FromStringAndSize(NULL, size) 创建的。 它不能被解除分配。 如果 obj 根本不是字节对象,则 PyBytes_AsStringAndSize() 返回 -1 并引发 TypeError

3.5 版更改: 以前,当在字节对象中遇到嵌入的空字节时,会引发 TypeError

void PyBytes_Concat(PyObject **bytes, PyObject *newpart)
*bytes 中创建一个新的字节对象,其中包含附加到 bytesnewpart 的内容; 调用者将拥有新的引用。 对 bytes 旧值的引用将被盗。 如果无法创建新对象,则仍会丢弃对 bytes 的旧引用,并将 *bytes 的值设置为 NULL; 将设置适当的例外。
void PyBytes_ConcatAndDel(PyObject **bytes, PyObject *newpart)
*bytes 中创建一个新的字节对象,其中包含附加到 bytesnewpart 的内容。 此版本减少了 newpart 的引用计数。
int _PyBytes_Resize(PyObject **bytes, Py_ssize_t newsize)
一种调整字节对象大小的方法,即使它是“不可变的”。 仅使用它来构建一个全新的字节对象; 如果在代码的其他部分可能已经知道字节,请不要使用它。 如果输入字节对象上的引用计数不是 1,则调用此函数是错误的。 将现有字节对象的地址作为左值(可以写入)和所需的新大小传递。 成功时, *bytes 保存调整大小的字节对象并返回 0*bytes 中的地址可能与其输入值不同。 如果重新分配失败,则在 *bytes 处的原始字节对象被释放,*bytes 设置为 NULL,设置 MemoryError,并且-1 返回。