[::T = uint8] does Blob[T] is repr('VMArray') is array_type(T)
Buf
扮演可变序列(通常为无符号)整数的角色。
my = Buf.new(1, 2, 3);[1] = 42;say .raku; # OUTPUT: «Buf.new(1,42,3)»
但是,它是一种参数化类型,可以使用多种整数类型进行实例化
my = Buf[int32].new(3, -3, 0xff32, -44);say ; # OUTPUT: «Buf[int32]:0x<03 -3 FF32 -2C>»
默认情况下,Buf
使用 8 位无符号整数,即它等效于 Buf[uint8]。一些其他类型的 Buf
使用频率较高,它们有自己的类名。
buf8 | Buf[uint8] |
buf16 | Buf[uint16] |
buf32 | Buf[uint32] |
buf64 | Buf[uint64] |
你可以像使用 Buf
一样使用它们
my = buf8.new(3, 6, 254);say ; # OUTPUT: «Buf[uint8]:0x<03 06 fe>»
其他对象上有一些方法,例如 encode
,在某些情况下它可能会返回一个 buf8
,这是特定编码的最佳表示。
方法§
方法 subbuf-rw§
method subbuf-rw( = 0, = self.elems - ) is rw
subbuf
的可变版本,它返回一个 Proxy
,用作缓冲区部分的可写引用。它的第一个参数 $from
指定缓冲区中应进行替换的索引,最后一个参数 $elems
指定要替换的元素数量。
例如,用两个元素 100
和 101
替换索引 3 处的一个元素
my Buf .= new(0..5);.subbuf-rw(3,1) = Buf.new(100, 101);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(123, 123);say .raku; # OUTPUT: «Buf.new(123, 123)»
例程 subbuf-rw§
multi subbuf-rw(Buf \b) is rwmulti subbuf-rw(Buf \b, Int() ) is rwmulti subbuf-rw(Buf \b, , ) is 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: Int )
更改 Buf
的元素数量,返回更改后的 Buf
。Buf
的大小将根据指定的 $elems
数量进行调整:如果它小于 Buf
的实际大小,则生成的 Buf
将缩小,否则它将扩大以适应 $elems
的数量。如果 Buf
被扩大,新创建的项目将被分配一个虚拟机特定的空值,因此你不应该依赖它们的值,因为它们在不同的虚拟机上可能不一致。
my Buf .= new(^10);.reallocate(5);say .raku; # OUTPUT: «Buf.new(0,1,2,3,4)»= Buf.new( 1..3 );.reallocate( 10 );say .raku; # OUTPUT: «Buf.new(1,2,3,0,0,0,0,0,0,0)»
方法 list§
multi method list(Buf:)
返回一个整数的List
。
say Buf.new(122,105,112,205).list; # OUTPUT: «(122 105 112 205)»
方法 push§
method push( )
在缓冲区的末尾添加元素。
my = Buf.new( 1, 1, 2, 3, 5 );.push( 8 );say .raku; # OUTPUT: «Buf.new(1,1,2,3,5,8)»
方法 pop§
method pop()
返回并移除缓冲区的最后一个元素。
my = Buf.new( 1, 1, 2, 3, 5 );say .pop(); # OUTPUT: «5»say .raku; # OUTPUT: «Buf.new(1,1,2,3)»
方法 append§
method append( )
追加到缓冲区的末尾。
my = Buf.new( 1, 1, 2, 3, 5 );.append(9, 8, 7, 6);say .raku; # OUTPUT: «Buf.new(1,1,2,3,5,9,8,7,6)»
方法 prepend§
method prepend( )
在缓冲区的开头插入元素。
my = Buf.new( 1, 1, 2, 3, 5 );.prepend( 0 );say .raku; # OUTPUT: «Buf.new(0,1,1,2,3,5)»
与方法 unshift
的区别在于,如果您追加一个单个数组或列表参数,prepend
将扁平化该数组/列表,而 unshift
将列表/数组作为单个元素追加。
方法 shift§
method shift()
移除并返回缓冲区的第一个元素。
my = Buf.new( 1, 1, 2, 3, 5 );say .shift(); # OUTPUT: «1»say .raku; # OUTPUT: «Buf.new(1,2,3,5)»
方法 unshift§
method unshift()
在缓冲区的开头插入元素。
my = Buf.new( 1, 1, 2, 3, 5 );.unshift( 0 );say .raku; # OUTPUT: «Buf.new(0,1,1,2,3,5)»
方法 splice§
method splice( Buf: = 0, ?, * --> Buf)
用其他元素替换缓冲区的元素,返回一个包含已移除元素的缓冲区。
my = Buf.new( 1, 1, 2, 3, 5 );say .splice: 0, 3, <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
。其他值是 LittleEndian
和 BigEndian
。
如果缓冲区还不够大,则将自动调整缓冲区大小以支持写入的任何字节。
方法 write-uint8§
method write-uint8(buf8: uint , uint8 , = NativeEndian --> Nil)
在给定位置写入一个无符号 8 位整数值。$endian
参数没有意义,但为了保持一致性而提供。
方法 write-int8§
method write-int8(buf8: uint , int8 , = NativeEndian --> Nil)
在给定位置写入一个有符号 8 位整数值。$endian
参数没有意义,但为了保持一致性而提供。
方法 write-uint16§
method write-uint16(buf8: uint , uint16 , = NativeEndian --> Nil)
在给定位置使用给定的字节序写入一个无符号 16 位整数值。
方法 write-int16§
method write-int16(buf8: uint , int16 , = NativeEndian --> Nil)
在给定位置使用给定的字节序写入一个有符号 16 位整数值。
方法 write-uint32§
method write-uint32(buf8: uint , uint32 , = NativeEndian --> Nil)
在给定位置使用给定字节序写入一个无符号 32 位整数值。
方法 write-int32§
method write-int32(buf8: uint , int32 , = NativeEndian --> Nil)
在给定位置使用给定字节序写入一个有符号 32 位整数值。
方法 write-uint64§
method write-uint64(buf8: uint , uint64 , = NativeEndian --> Nil)
在给定位置使用给定字节序写入一个无符号 64 位整数值。
方法 write-int64§
method write-int64(buf8: uint , Int , = NativeEndian --> Nil)
在给定位置使用给定字节序写入一个有符号 64 位整数值。
方法 write-uint128§
method write-uint128(buf8: uint , UInt , = NativeEndian --> Nil)
在给定位置使用给定字节序写入一个无符号 128 位整数值。
方法 write-int128§
method write-int128(buf8: uint , Int , = NativeEndian --> Nil)
在给定位置使用给定字节序写入一个有符号 128 位整数值。
方法 write-num32§
method write-num32(buf8: uint , num32 , = NativeEndian --> Nil)
在给定位置使用给定字节序写入一个本机 num32
IEEE 浮点数。
方法 write-num64§
method write-num64(buf8: uint , num64 , = NativeEndian --> Nil)
在给定位置使用给定字节序写入一个本机 num64
IEEE 浮点数。
仅 buf8 上的方法(6.d、2019.03 及更高版本)§
方法 write-ubits§
method write-ubits(buf8: uint , uint , UInt --> Nil)
将一个无符号整数值写入从给定 位偏移和给定位数的 位。位的字节序假定为 BigEndian
。始终返回 Nil。
方法 write-bits§
method write-bits(buf8: uint , uint , Int --> Nil)
为从给定 位偏移和给定位数的 位写入一个有符号整数值。位的字节序假定为 BigEndian
。始终返回 Nil。
仅 buf8 上的方法(6.d、2019.10 及更高版本)§
这些方法仅适用于 buf8
类型。它们允许低级别访问向底层数据写入字节,并且在类型(整数或浮点数(num))、大小(8、16、32、64 或 128 位)、有符号或无符号(对于整数值)和字节序(本机、小端和端)方面以不同的方式写入字节序(本机、小端和端)。
这些方法也可以在 buf8
类型对象上调用,在这种情况下将返回一个新的 buf8
对象。否则,将返回调用者以允许在 buf8
对象上更轻松地链接操作。如果缓冲区还不够大,它将自动调整大小以支持写入的任何字节。
字节序必须使用 Endian
枚举的值作为这些方法的第三个参数来指示。如果未指定字节序,则将假定为 NativeEndian
。其他值是 LittleEndian
和 BigEndian
。
方法 write-uint8§
method write-uint8(buf8: uint , uint8 , = NativeEndian --> buf8)
在给定位置写入一个无符号 8 位整数值。$endian
参数没有意义,但为了保持一致性而提供。
方法 write-int8§
method write-int8(buf8: uint , int8 , = NativeEndian --> buf8)
在给定位置写入一个有符号 8 位整数值。$endian
参数没有意义,但为了保持一致性而提供。
方法 write-uint16§
method write-uint16(buf8: uint , uint16 , = NativeEndian --> buf8)
在给定位置使用给定的字节序写入一个无符号 16 位整数值。
方法 write-int16§
method write-int16(buf8: uint , int16 , = NativeEndian --> buf8)
在给定位置使用给定的字节序写入一个有符号 16 位整数值。
方法 write-uint32§
method write-uint32(buf8: uint , uint32 , = NativeEndian --> buf8)
在给定位置使用给定字节序写入一个无符号 32 位整数值。
方法 write-int32§
method write-int32(buf8: uint , int32 , = NativeEndian --> buf8)
在给定位置使用给定字节序写入一个有符号 32 位整数值。
方法 write-uint64§
method write-uint64(buf8: uint , uint64 , = NativeEndian --> buf8)
在给定位置使用给定字节序写入一个无符号 64 位整数值。
方法 write-int64§
method write-int64(buf8: uint , Int , = NativeEndian --> buf8)
在给定位置使用给定字节序写入一个有符号 64 位整数值。
方法 write-uint128§
method write-uint128(buf8: uint , UInt , = NativeEndian --> buf8)
在给定位置使用给定字节序写入一个无符号 128 位整数值。
方法 write-int128§
method write-int128(buf8: uint , Int , = NativeEndian --> buf8)
在给定位置使用给定字节序写入一个有符号 128 位整数值。
方法 write-num32§
method write-num32(buf8: uint , num32 , = NativeEndian --> buf8)
在给定位置使用给定字节序写入一个本机 num32
IEEE 浮点数。
方法 write-num64§
method write-num64(buf8: uint , num64 , = NativeEndian --> buf8)
在给定位置使用给定字节序写入一个本机 num64
IEEE 浮点数。
方法 write-ubits§
method write-ubits(buf8: uint , uint , UInt --> buf8)
将无符号整数值写入从给定的 bit 偏移量和给定的位数的 bits。假定位元的字节序为 BigEndian
。
方法 write-bits§
method write-bits(buf8: uint , uint , Int --> buf8)
为从给定的 bit 偏移量和给定的位数的 bits 写入有符号整数值。假定位元的字节序为 BigEndian
。
方法 Blob§
method Buf(Buf: --> Blob)
自 2021.06 Rakudo 编译器版本起可用。
将调用者强制转换为不可变的 Blob
对象。