role Buf[::T = uint8does Blob[Tis repr('VMArray'is array_type(T){ ... }

Buf 扮演可变序列(通常为无符号)整数的角色。

my $ = Buf.new(123);
$[1= 42;
say $.raku# OUTPUT: «Buf.new(1,42,3)␤»

但是,它是一种参数化类型,可以使用多种整数类型进行实例化

my $ = Buf[int32].new(3-30xff32-44);
say $# OUTPUT: «Buf[int32]:0x<03 -3 FF32 -2C>␤»

默认情况下,Buf 使用 8 位无符号整数,即它等效于 Buf[uint8]。一些其他类型的 Buf 使用频率较高,它们有自己的类名。

buf8Buf[uint8]
buf16Buf[uint16]
buf32Buf[uint32]
buf64Buf[uint64]

你可以像使用 Buf 一样使用它们

my $ = buf8.new(36254);
say $# OUTPUT: «Buf[uint8]:0x<03 06 fe>␤»

其他对象上有一些方法,例如 encode,在某些情况下它可能会返回一个 buf8,这是特定编码的最佳表示。

方法§

方法 subbuf-rw§

method subbuf-rw($from = 0$elems = self.elems - $fromis rw

subbuf 的可变版本,它返回一个 Proxy,用作缓冲区部分的可写引用。它的第一个参数 $from 指定缓冲区中应进行替换的索引,最后一个参数 $elems 指定要替换的元素数量。

例如,用两个元素 100101 替换索引 3 处的一个元素

my Buf $ .= new(0..5);
$.subbuf-rw(3,1= Buf.new(100101);
say $.raku;   # OUTPUT: «Buf.new(0,1,2,100,101,4,5)␤»

如果未指定 $elems 参数,则替换在指定的索引 $from 处发生,并删除所有尾随元素

my Buf $ .= new(0..5);
$.subbuf-rw(3= Buf.new(200);
say $.raku;   # OUTPUT: «Buf.new(0,1,2,200)␤»

如果未指定 $from 参数,则替换从缓冲区的开头开始

my Buf $ .= new(0..5);
$.subbuf-rw = Buf.new(123123);
say $.raku;   # OUTPUT: «Buf.new(123, 123)␤»

例程 subbuf-rw§

multi subbuf-rw(Buf:D \bis rw
multi subbuf-rw(Buf:D \bInt() $fromis rw
multi subbuf-rw(Buf:D \b$from$elemsis rw

返回缓冲区部分的可写引用。对指定的 Buf 调用 subbuf-rw 方法

my Buf $ .= new(1,2,3);
subbuf-rw($,2,1= Buf.new(42);
say $.raku;   # OUTPUT: «Buf.new(1,2,42)␤»

方法 reallocate§

method reallocate(Buf:D: Int:D $elems)

更改 Buf 的元素数量,返回更改后的 BufBuf 的大小将根据指定的 $elems 数量进行调整:如果它小于 Buf 的实际大小,则生成的 Buf 将缩小,否则它将扩大以适应 $elems 的数量。如果 Buf 被扩大,新创建的项目将被分配一个虚拟机特定的空值,因此你不应该依赖它们的值,因为它们在不同的虚拟机上可能不一致。

my Buf $ .= new(^10);
$.reallocate(5);
say $.raku;  # OUTPUT: «Buf.new(0,1,2,3,4)␤» 
 
$ = Buf.new1..3 );
$.reallocate10 );
say $.raku# OUTPUT: «Buf.new(1,2,3,0,0,0,0,0,0,0)␤»

方法 list§

multi method list(Buf:D:)

返回一个整数的List

say Buf.new(122,105,112,205).list# OUTPUT: «(122 105 112 205)␤»

方法 push§

method push$elems )

在缓冲区的末尾添加元素。

my $ = Buf.new11235 );
$.push8 );
say $.raku# OUTPUT: «Buf.new(1,1,2,3,5,8)␤»

方法 pop§

method pop()

返回并移除缓冲区的最后一个元素。

my $ = Buf.new11235 );
say $.pop(); # OUTPUT: «5␤» 
say $.raku;  # OUTPUT: «Buf.new(1,1,2,3)␤»

方法 append§

method append$elems )

追加到缓冲区的末尾。

my $ = Buf.new11235 );
$.append(9876);
say $.raku# OUTPUT: «Buf.new(1,1,2,3,5,9,8,7,6)␤»

方法 prepend§

method prepend$elems )

在缓冲区的开头插入元素。

my $ = Buf.new11235 );
$.prepend0 );
say $.raku# OUTPUT: «Buf.new(0,1,1,2,3,5)␤»

与方法 unshift 的区别在于,如果您追加一个单个数组或列表参数,prepend 将扁平化该数组/列表,而 unshift 将列表/数组作为单个元素追加。

方法 shift§

method shift()

移除并返回缓冲区的第一个元素。

my $ = Buf.new11235 );
say $.shift(); # OUTPUT: «1␤» 
say $.raku;    # OUTPUT: «Buf.new(1,2,3,5)␤»

方法 unshift§

method unshift()

在缓冲区的开头插入元素。

my $ = Buf.new11235 );
$.unshift0 );
say $.raku# OUTPUT: «Buf.new(0,1,1,2,3,5)␤»

方法 splice§

method spliceBuf:D: $start = 0$elems?*@replacement --> Buf)

用其他元素替换缓冲区的元素,返回一个包含已移除元素的缓冲区。

my $ = Buf.new11235 );
say $.splice:  03, <3 2 1>;  # OUTPUT: «Buf:0x<01 01 02>␤» 
say $.raku;                    # OUTPUT: «Buf.new(3,2,1,3,5)␤»

仅适用于 buf8 的方法 (6.d、2018.12 及更高版本)§

这些方法仅适用于 buf8 类型。它们允许低级别访问,以不同方式将字节写入底层数据,涉及类型(整数或浮点数 (num))、大小(8、16、32、64 或 128 位)、有符号或无符号(对于整数值)和字节序(本机、小端和大小端)。这些方法始终返回 Nil

字节序必须使用 Endian 枚举的值作为这些方法的第三个参数来指示。如果未指定字节序,则将假定为 NativeEndian。其他值是 LittleEndianBigEndian

如果缓冲区还不够大,则将自动调整缓冲区大小以支持写入的任何字节。

方法 write-uint8§

method write-uint8(buf8:D: uint $posuint8 $value$endian = NativeEndian --> Nil)

在给定位置写入一个无符号 8 位整数值。$endian 参数没有意义,但为了保持一致性而提供。

方法 write-int8§

method write-int8(buf8:D: uint $posint8 $value$endian = NativeEndian --> Nil)

在给定位置写入一个有符号 8 位整数值。$endian 参数没有意义,但为了保持一致性而提供。

方法 write-uint16§

method write-uint16(buf8:D: uint $posuint16 $value$endian = NativeEndian --> Nil)

在给定位置使用给定的字节序写入一个无符号 16 位整数值。

方法 write-int16§

method write-int16(buf8:D: uint $posint16 $value$endian = NativeEndian --> Nil)

在给定位置使用给定的字节序写入一个有符号 16 位整数值。

方法 write-uint32§

method write-uint32(buf8:D: uint $posuint32 $value$endian = NativeEndian --> Nil)

在给定位置使用给定字节序写入一个无符号 32 位整数值。

方法 write-int32§

method write-int32(buf8:D: uint $posint32 $value$endian = NativeEndian --> Nil)

在给定位置使用给定字节序写入一个有符号 32 位整数值。

方法 write-uint64§

method write-uint64(buf8:D: uint $posuint64 $value$endian = NativeEndian --> Nil)

在给定位置使用给定字节序写入一个无符号 64 位整数值。

方法 write-int64§

method write-int64(buf8:D: uint $posInt:D $value$endian = NativeEndian --> Nil)

在给定位置使用给定字节序写入一个有符号 64 位整数值。

方法 write-uint128§

method write-uint128(buf8:D: uint $posUInt:D $value$endian = NativeEndian --> Nil)

在给定位置使用给定字节序写入一个无符号 128 位整数值。

方法 write-int128§

method write-int128(buf8:D: uint $posInt:D $value$endian = NativeEndian --> Nil)

在给定位置使用给定字节序写入一个有符号 128 位整数值。

方法 write-num32§

method write-num32(buf8:D: uint $posnum32 $value$endian = NativeEndian --> Nil)

在给定位置使用给定字节序写入一个本机 num32 IEEE 浮点数。

方法 write-num64§

method write-num64(buf8:D: uint $posnum64 $value$endian = NativeEndian --> Nil)

在给定位置使用给定字节序写入一个本机 num64 IEEE 浮点数。

仅 buf8 上的方法(6.d、2019.03 及更高版本)§

方法 write-ubits§

method write-ubits(buf8:D: uint $posuint $bitsUInt:D $value --> Nil)

将一个无符号整数值写入从给定 偏移和给定位数的 。位的字节序假定为 BigEndian。始终返回 Nil。

方法 write-bits§

method write-bits(buf8:D: uint $posuint $bitsInt:D $value --> Nil)

为从给定 偏移和给定位数的 写入一个有符号整数值。位的字节序假定为 BigEndian。始终返回 Nil。

仅 buf8 上的方法(6.d、2019.10 及更高版本)§

这些方法仅适用于 buf8 类型。它们允许低级别访问向底层数据写入字节,并且在类型(整数或浮点数(num))、大小(8、16、32、64 或 128 位)、有符号或无符号(对于整数值)和字节序(本机、小端和端)方面以不同的方式写入字节序(本机、小端和端)。

这些方法也可以在 buf8 类型对象上调用,在这种情况下将返回一个新的 buf8 对象。否则,将返回调用者以允许在 buf8 对象上更轻松地链接操作。如果缓冲区还不够大,它将自动调整大小以支持写入的任何字节。

字节序必须使用 Endian 枚举的值作为这些方法的第三个参数来指示。如果未指定字节序,则将假定为 NativeEndian。其他值是 LittleEndianBigEndian

方法 write-uint8§

method write-uint8(buf8: uint $posuint8 $value$endian = NativeEndian --> buf8:D)

在给定位置写入一个无符号 8 位整数值。$endian 参数没有意义,但为了保持一致性而提供。

方法 write-int8§

method write-int8(buf8: uint $posint8 $value$endian = NativeEndian --> buf8:D)

在给定位置写入一个有符号 8 位整数值。$endian 参数没有意义,但为了保持一致性而提供。

方法 write-uint16§

method write-uint16(buf8: uint $posuint16 $value$endian = NativeEndian --> buf8:D)

在给定位置使用给定的字节序写入一个无符号 16 位整数值。

方法 write-int16§

method write-int16(buf8: uint $posint16 $value$endian = NativeEndian --> buf8:D)

在给定位置使用给定的字节序写入一个有符号 16 位整数值。

方法 write-uint32§

method write-uint32(buf8: uint $posuint32 $value$endian = NativeEndian --> buf8:D)

在给定位置使用给定字节序写入一个无符号 32 位整数值。

方法 write-int32§

method write-int32(buf8: uint $posint32 $value$endian = NativeEndian --> buf8:D)

在给定位置使用给定字节序写入一个有符号 32 位整数值。

方法 write-uint64§

method write-uint64(buf8: uint $posuint64 $value$endian = NativeEndian --> buf8:D)

在给定位置使用给定字节序写入一个无符号 64 位整数值。

方法 write-int64§

method write-int64(buf8: uint $posInt:D $value$endian = NativeEndian --> buf8:D)

在给定位置使用给定字节序写入一个有符号 64 位整数值。

方法 write-uint128§

method write-uint128(buf8: uint $posUInt:D $value$endian = NativeEndian --> buf8:D)

在给定位置使用给定字节序写入一个无符号 128 位整数值。

方法 write-int128§

method write-int128(buf8: uint $posInt:D $value$endian = NativeEndian --> buf8:D)

在给定位置使用给定字节序写入一个有符号 128 位整数值。

方法 write-num32§

method write-num32(buf8: uint $posnum32 $value$endian = NativeEndian --> buf8:D)

在给定位置使用给定字节序写入一个本机 num32 IEEE 浮点数。

方法 write-num64§

method write-num64(buf8: uint $posnum64 $value$endian = NativeEndian --> buf8:D)

在给定位置使用给定字节序写入一个本机 num64 IEEE 浮点数。

方法 write-ubits§

method write-ubits(buf8: uint $posuint $bitsUInt:D $value --> buf8:D)

将无符号整数值写入从给定的 bit 偏移量和给定的位数的 bits。假定位元的字节序为 BigEndian

方法 write-bits§

method write-bits(buf8: uint $posuint $bitsInt:D $value --> buf8:D)

为从给定的 bit 偏移量和给定的位数的 bits 写入有符号整数值。假定位元的字节序为 BigEndian

方法 Blob§

method Buf(Buf:D: --> Blob:D)

自 2021.06 Rakudo 编译器版本起可用。

将调用者强制转换为不可变的 Blob 对象。

类型图§

Buf 的类型关系
raku-type-graph Buf Buf Blob Blob Buf->Blob Positional Positional Stringy Stringy Blob->Positional Blob->Stringy

展开上面的图表