[::T = uint8] does Positional[T] does Stringy
Blob
角色是二进制类型的不可变接口,并为整数列表(通常是无符号整数)提供类似列表的接口。
但是,它是一种参数化类型,你可以使用多种整数类型进行实例化
my = Blob[int32].new(3, -3, 0xff32, -44);say ; # OUTPUT: «Blob[int32]:0x<03 -3 FF32 -2C>»
默认情况下,Blob
使用 8 位无符号整数,即它等同于 Blob[uint8]。其他一些经常使用的 Blob
类型有自己的类名。
blob8 | Blob[uint8] |
blob16 | Blob[uint16] |
blob32 | Blob[uint32] |
blob64 | Blob[uint64] |
你可以使用它们的方式与使用 Blob
的方式几乎相同
my = blob8.new(3, 6, 254);say ; # OUTPUT: «Blob[uint8]:0x<03 06 FE>»
方法§
方法 new§
multi method new(Blob:)multi method new(Blob: Blob )multi method new(Blob: int )multi method new(Blob: )multi method new(Blob: *)
创建一个空的 Blob
,或从另一个 Blob
创建一个新的 Blob
,或从整数或值列表创建(这些值需要强制转换为整数)
my = Blob.new([1, 2, 3]);say Blob.new(<1 2 3>); # OUTPUT: «Blob:0x<01 02 03>»
方法 Bool§
multi method Bool(Blob:)
当且仅当缓冲区为空时返回 False
。
my = Blob.new();say .Bool; # OUTPUT: «False»= Blob.new([1, 2, 3]);say .Bool; # OUTPUT: «True»
方法 Capture§
method Capture(Blob:)
方法 elems§
multi method elems(Blob:)
返回缓冲区的元素数量。
my = Blob.new([1, 2, 3]);say .elems; # OUTPUT: «3»
方法 bytes§
method bytes(Blob: --> Int)
返回缓冲区中的元素使用的字节数。
say Blob.new([1, 2, 3]).bytes; # OUTPUT: «3»say blob16.new([1, 2, 3]).bytes; # OUTPUT: «6»say blob64.new([1, 2, 3]).bytes; # OUTPUT: «24»
方法 chars§
method chars(Blob:)
抛出 X::Buf::AsStr
,其中 chars
作为有效负载。
方法 Str§
multi method Str(Blob:)
抛出 X::Buf::AsStr
,其中 Str
作为有效负载。要转换为 Str
,你需要使用 .decode
。
方法 Stringy§
multi method Stringy(Blob:)
抛出 X::Buf::AsStr
,其中 Stringy
作为有效负载。
方法 decode§
multi method decode(Blob: = self.encoding // "utf-8")
multi method decode(Blob: , Str :!,Bool : = False)
multi method decode(Blob: , Bool : = False)
应用编码将 blob 转换为 Str
;默认情况下,编码将为 UTF-8。
my Blob = "string".encode('utf-8');say .decode('utf-8'); # OUTPUT: «string»
对于格式错误的 utf-8,.decode
将抛出 X::AdHoc。若要处理不规范的 utf-8,请使用 utf8-c8
。
方法 list§
multi method list(Blob:)
返回一个整数 List
say "zipi".encode("ascii").list; # OUTPUT: «(122 105 112 105)»
方法 gist§
method gist(Blob: --> Str)
返回包含 Blob
的“要点”的字符串,列出前 100 个元素,用空格分隔,如果 Blob
有 100 个以上的元素,则追加省略号。
put Blob.new(1, 2, 3).gist; # OUTPUT: «Blob:0x<01 02 03>»put Blob.new(1..2000).gist;# OUTPUT:# Blob:0x<01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15# 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C# 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43# 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A# 5B 5C 5D 5E 5F 60 61 62 63 64 ...>
方法 subbuf§
multi method subbuf(Int , Int = self.elems --> Blob)multi method subbuf(Range --> Blob)multi method subbuf(Blob: )multi method subbuf(Blob: Int , )multi method subbuf(Blob: , )multi method subbuf(Blob: \from, Whatever)multi method subbuf(Blob: \from, Numeric \length)
从索引中提取调用方缓冲区的一部分,从元素 $from
开始,并获取 $len
个元素(如果缓冲区较短,则更少),并创建一个新的缓冲区作为结果。
say Blob.new(1..10).subbuf(2, 4); # OUTPUT: «Blob:0x<03 04 05 06>»say Blob.new(1..10).subbuf(*-2); # OUTPUT: «Blob:0x<09 0a>»say Blob.new(1..10).subbuf(*-5,2); # OUTPUT: «Blob:0x<06 07>»
为方便起见,还允许指定 Range
以指示您希望调用方缓冲区的哪一部分
say Blob.new(1..10).subbuf(2..5); # OUTPUT: «Blob:0x<03 04 05 06>»
方法 allocate§
multi method allocate(Blob: Int )multi method allocate(Blob: Int , int )multi method allocate(Blob: Int , Int \value)multi method allocate(Blob: Int , Mu )multi method allocate(Blob: Int , int )multi method allocate(Blob: Int , Blob )multi method allocate(Blob: Int , )
返回一个新创建的 Blob
对象,其中包含给定数量的元素。可以选择采用第二个参数,该参数指示用于填充 Blob
的模式:这可以是单个(可能是本机)整数值,或任何生成整数值的 Iterable
,包括另一个 Blob
。如果没有提供足够的值来填充整个 Blob
,则该模式将被重复。
my Blob = Blob.allocate(10,0);.say; # OUTPUT: «Blob:0x<00 00 00 00 00 00 00 00 00 00>»
如果模式是一个一般的 Mu
值,它将失败。
例程 unpack§
此方法被认为是实验性的,为了使用它,您需要执行
use experimental :pack;multi method unpack(Blob: Str )multi method unpack(Blob: )multi unpack(Blob \blob, Str )multi unpack(Blob \blob, )
根据模板字符串从 blob 中提取特征,并将其作为列表返回。
模板字符串由零个或多个单元组成,这些单元以 ASCII 字母开头,并且可选地后跟量词。量词可以是 *
(通常表示“在此处使用 Blob 的其余部分”),或正整数(没有 +
)。
模板单元之间的空格将被忽略。
有效模板的示例包括 "A4 C n*"
和 "A*"
。
识别以下字母
字母 | 含义 |
---|---|
A | 提取一个字符串,其中 Blob 的每个元素都映射到一个代码点 |
a | 与 A 相同 |
C | 将 blob 中的元素作为整数提取 |
H | 提取一个十六进制字符串 |
L | 提取四个元素,并将它们作为单个无符号整数返回 |
n | 提取两个元素,并按照“网络”(大端)字节顺序将它们组合成一个整数 |
N | 提取四个元素,并按照“网络”(大端)字节顺序将它们组合成一个整数 |
S | 提取两个元素并将其作为单个无符号整数返回 |
v | 与 S 相同 |
V | 与 L 相同 |
x | 从 blob 中删除一个元素(即忽略它) |
Z | 与 A 相同 |
示例
use experimental :pack;say Blob.new(1..10).unpack("C*");# OUTPUT: «(1 2 3 4 5 6 7 8 9 10)»
子例程 pack§
此子例程被认为是实验性的,为了使用它,您需要执行
use experimental :pack;
multi pack(Str , *)multi pack(, *)
根据模板打包给定的项目并返回包含打包字节的缓冲区。
模板字符串由一个或多个以 ASCII 字母开头的单元组成,并且可以跟一个量词。有关详细信息,请参阅 unpack。
方法 reverse§
method reverse(Blob: --> Blob)
返回所有元素按相反顺序排列的 Blob。
say Blob.new([1, 2, 3]).reverse; # OUTPUT: «Blob:0x<03 02 01>»say blob16.new([2]).reverse; # OUTPUT: «Blob[uint16]:0x<02>»say blob32.new([16, 32]).reverse; # OUTPUT: «Blob[uint32]:0x<20 10>»
仅 blob8 上的方法(6.d、2018.12 及更高版本)§
这些方法仅适用于 blob8(和 buf8
)类型。它们允许低级别访问从底层数据读取字节并以不同方式解释它们,涉及类型(整数或浮点数(num))、大小(8、16、32、64 或 128 位)、有符号或无符号(对于整数值)和字节序(本机、小端和大小端)。返回的值始终扩展到 64 位本机值(如果可能),如果不可能,则扩展到(大)整数值。
必须使用 Endian
枚举的值作为这些方法的第二个参数来指示字节序。如果未指定字节序,则假定为 NativeEndian
。其他值是 LittleEndian
和 BigEndian
。
方法 read-uint8§
method read-uint8(blob8: uint , = NativeEndian --> uint)
返回给定位置字节的无符号本机整数值。$endian
参数没有意义,但为了保持一致性而提供。
方法 read-int8§
method read-int8(blob8: uint , = NativeEndian --> int)
返回给定位置字节的本机 int
值。$endian
参数没有意义,但为了保持一致性而提供。
方法 read-uint16§
method read-uint16(blob8: uint , = NativeEndian --> uint)
返回从给定位置开始的两个字节的本机 uint
值。
方法 read-int16§
method read-int16(blob8: uint , = NativeEndian --> int)
返回从给定位置开始的两个字节的本机 int
值。
方法 read-uint32§
method read-uint32(blob8: uint , = NativeEndian --> uint)
返回从给定位置开始的四个字节的本机 uint
值。
方法 read-int32§
method read-int32(blob8: uint , = NativeEndian --> int)
返回从给定位置开始的四个字节的本机 int
值。
方法 read-uint64§
method read-uint64(blob8: uint , = NativeEndian --> UInt)
返回从给定位置开始的八个字节的无符号整数值。
方法 read-int64§
method read-int64(blob8: uint , = NativeEndian --> int)
返回从给定位置开始的八个字节的本机 int
值。
方法 read-uint128§
method read-uint128(blob8: uint , = NativeEndian --> UInt)
返回从给定位置开始的十六个字节的无符号整数值。
方法 read-int128§
method read-int128(blob8: uint , = NativeEndian --> Int)
返回从给定位置开始的十六个字节的整数值。
方法 read-num32§
method read-num32(blob8: uint , = NativeEndian --> int)
返回从给定位置开始的四个字节的本机num
值。
方法 read-num64§
method read-num64(blob8: uint , = NativeEndian --> int)
返回从给定位置开始的八个字节的本机num
值。
仅在 blob8 上的方法(6.d、2019.03 及更高版本)§
方法 read-ubits§
method read-ubits(blob8: uint , uint --> UInt)
返回从给定的位偏移量和给定的位数中获得的位的无符号整数值。位的字节序假定为BigEndian
。
方法 read-bits§
method read-bits(blob8: uint , uint --> Int)
返回从给定的位偏移量和给定的位数中获得的位的有符号整数值。位的字节序假定为BigEndian
。
方法 Buf§
method Buf(Blob: --> Buf)
从 2021.06 Rakudo 编译器版本开始提供。
将调用者强制转换为可变的 Buf
对象。