role Blob[::T = uint8does Positional[Tdoes Stringy { }

Blob 角色是二进制类型的不可变接口,并为整数列表(通常是无符号整数)提供类似列表的接口。

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

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

默认情况下,Blob 使用 8 位无符号整数,即它等同于 Blob[uint8]。其他一些经常使用的 Blob 类型有自己的类名。

blob8Blob[uint8]
blob16Blob[uint16]
blob32Blob[uint32]
blob64Blob[uint64]

你可以使用它们的方式与使用 Blob 的方式几乎相同

my $blob = blob8.new(36254);
say $blob# OUTPUT: «Blob[uint8]:0x<03 06 FE>␤»

方法§

方法 new§

multi method new(Blob:)
multi method new(Blob: Blob:D $blob)
multi method new(Blob: int @values)
multi method new(Blob: @values)
multi method new(Blob: *@values)

创建一个空的 Blob,或从另一个 Blob 创建一个新的 Blob,或从整数或值列表创建(这些值需要强制转换为整数)

my $blob = Blob.new([123]);
say Blob.new(<1 2 3>); # OUTPUT: «Blob:0x<01 02 03>␤»

方法 Bool§

multi method Bool(Blob:D:)

当且仅当缓冲区为空时返回 False

my $blob = Blob.new();
say $blob.Bool# OUTPUT: «False␤» 
$blob = Blob.new([123]);
say $blob.Bool# OUTPUT: «True␤»

方法 Capture§

method Capture(Blob:D:)

将对象转换为 List,然后强制转换为 Capture

方法 elems§

multi method elems(Blob:D:)

返回缓冲区的元素数量。

my $blob = Blob.new([123]);
say $blob.elems# OUTPUT: «3␤»

方法 bytes§

method bytes(Blob:D: --> Int:D)

返回缓冲区中的元素使用的字节数。

say Blob.new([123]).bytes;      # OUTPUT: «3␤» 
say blob16.new([123]).bytes;    # OUTPUT: «6␤» 
say blob64.new([123]).bytes;    # OUTPUT: «24␤»

方法 chars§

method chars(Blob:D:)

抛出 X::Buf::AsStr,其中 chars 作为有效负载。

方法 Str§

multi method Str(Blob:D:)

抛出 X::Buf::AsStr,其中 Str 作为有效负载。要转换为 Str,你需要使用 .decode

方法 Stringy§

multi method Stringy(Blob:D:)

抛出 X::Buf::AsStr,其中 Stringy 作为有效负载。

方法 decode§

multi method decode(Blob:D: $encoding = self.encoding // "utf-8")
multi method decode(Blob:D: $encodingStr :$replacement!,
                    Bool:D :$strict = False)
multi method decode(Blob:D: $encodingBool:D :$strict = False)

应用编码将 blob 转换为 Str;默认情况下,编码将为 UTF-8。

my Blob $blob = "string".encode('utf-8');
say $blob.decode('utf-8'); # OUTPUT: «string␤»

对于格式错误的 utf-8,.decode 将抛出 X::AdHoc。若要处理不规范的 utf-8,请使用 utf8-c8

方法 list§

multi method list(Blob:D:)

返回一个整数 List

say "zipi".encode("ascii").list# OUTPUT: «(122 105 112 105)␤»

方法 gist§

method gist(Blob:D: --> Str:D)

返回包含 Blob 的“要点”的字符串,列出前 100 个元素,用空格分隔,如果 Blob 有 100 个以上的元素,则追加省略号。

put Blob.new(123).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 $fromInt $len = self.elems --> Blob:D)
multi method subbuf(Range $range --> Blob:D)
multi method subbuf(Blob:D: &From)
multi method subbuf(Blob:D: Int:D $From&End)
multi method subbuf(Blob:D: &From&End)
multi method subbuf(Blob:D: \fromWhatever)
multi method subbuf(Blob:D: \fromNumeric \length)

从索引中提取调用方缓冲区的一部分,从元素 $from 开始,并获取 $len 个元素(如果缓冲区较短,则更少),并创建一个新的缓冲区作为结果。

say Blob.new(1..10).subbuf(24);    # 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:U: Int:D $elements)
multi method allocate(Blob:U: Int:D $elementsint $value)
multi method allocate(Blob:U: Int:D $elementsInt:D \value)
multi method allocate(Blob:U: Int:D $elementsMu:D $got)
multi method allocate(Blob:U: Int:D $elementsint @values)
multi method allocate(Blob:U: Int:D $elementsBlob:D $blob)
multi method allocate(Blob:U: Int:D $elements@values)

返回一个新创建的 Blob 对象,其中包含给定数量的元素。可以选择采用第二个参数,该参数指示用于填充 Blob 的模式:这可以是单个(可能是本机)整数值,或任何生成整数值的 Iterable,包括另一个 Blob。如果没有提供足够的值来填充整个 Blob,则该模式将被重复。

my Blob $b0 = Blob.allocate(10,0);
$b0.say# OUTPUT: «Blob:0x<00 00 00 00 00 00 00 00 00 00>␤»

如果模式是一个一般的 Mu 值,它将失败。

例程 unpack§

此方法被认为是实验性的,为了使用它,您需要执行

use experimental :pack;
 
multi method unpack(Blob:D: Str:D $template)
multi method unpack(Blob:D: @template)
multi        unpack(Blob:D \blobStr:D $template)
multi        unpack(Blob:D \blob@template)

根据模板字符串从 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 $template*@items)
multi pack(@template*@items)

根据模板打包给定的项目并返回包含打包字节的缓冲区。

模板字符串由一个或多个以 ASCII 字母开头的单元组成,并且可以跟一个量词。有关详细信息,请参阅 unpack

方法 reverse§

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

返回所有元素按相反顺序排列的 Blob。

say Blob.new([123]).reverse;    # OUTPUT: «Blob:0x<03 02 01>␤» 
say blob16.new([2]).reverse;        # OUTPUT: «Blob[uint16]:0x<02>␤» 
say blob32.new([1632]).reverse;   # OUTPUT: «Blob[uint32]:0x<20 10>␤»

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

这些方法仅适用于 blob8(和 buf8)类型。它们允许低级别访问从底层数据读取字节并以不同方式解释它们,涉及类型(整数或浮点数(num))、大小(8、16、32、64 或 128 位)、有符号或无符号(对于整数值)和字节序(本机、小端和大小端)。返回的值始终扩展到 64 位本机值(如果可能),如果不可能,则扩展到(大)整数值。

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

方法 read-uint8§

method read-uint8(blob8:D: uint $pos$endian = NativeEndian --> uint)

返回给定位置字节的无符号本机整数值。$endian 参数没有意义,但为了保持一致性而提供。

方法 read-int8§

method read-int8(blob8:D: uint $pos$endian = NativeEndian --> int)

返回给定位置字节的本机 int 值。$endian 参数没有意义,但为了保持一致性而提供。

方法 read-uint16§

method read-uint16(blob8:D: uint $pos$endian = NativeEndian --> uint)

返回从给定位置开始的两个字节的本机 uint 值。

方法 read-int16§

method read-int16(blob8:D: uint $pos$endian = NativeEndian --> int)

返回从给定位置开始的两个字节的本机 int 值。

方法 read-uint32§

method read-uint32(blob8:D: uint $pos$endian = NativeEndian --> uint)

返回从给定位置开始的四个字节的本机 uint 值。

方法 read-int32§

method read-int32(blob8:D: uint $pos$endian = NativeEndian --> int)

返回从给定位置开始的四个字节的本机 int 值。

方法 read-uint64§

method read-uint64(blob8:D: uint $pos$endian = NativeEndian --> UInt:D)

返回从给定位置开始的八个字节的无符号整数值。

方法 read-int64§

method read-int64(blob8:D: uint $pos$endian = NativeEndian --> int)

返回从给定位置开始的八个字节的本机 int 值。

方法 read-uint128§

method read-uint128(blob8:D: uint $pos$endian = NativeEndian --> UInt:D)

返回从给定位置开始的十六个字节的无符号整数值。

方法 read-int128§

method read-int128(blob8:D: uint $pos$endian = NativeEndian --> Int:D)

返回从给定位置开始的十六个字节的整数值。

方法 read-num32§

method read-num32(blob8:D: uint $pos$endian = NativeEndian --> int)

返回从给定位置开始的四个字节的本机num值。

方法 read-num64§

method read-num64(blob8:D: uint $pos$endian = NativeEndian --> int)

返回从给定位置开始的个字节的本机num值。

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

方法 read-ubits§

method read-ubits(blob8:D: uint $posuint $bits --> UInt:D)

返回从给定的偏移量和给定的位数中获得的的无符号整数值。位的字节序假定为BigEndian

方法 read-bits§

method read-bits(blob8:D: uint $posuint $bits --> Int:D)

返回从给定的偏移量和给定的位数中获得的的有符号整数值。位的字节序假定为BigEndian

方法 Buf§

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

从 2021.06 Rakudo 编译器版本开始提供。

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

类型图§

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

展开上面的图表