字节处理

虽然有许多用于与以太坊交互的高级api,如Contracts和Providers,但许多低级访问需要通过字节进行操作。

其中许多操作是内部使用的,但各种函数和方法的输出可以用规范化二进制数据表示。

类型

Bytes

Bytes是一个Array或TypedArray对象, 每个值都在有效字节范围内(例如0到255之间),或者是一个具有length属性的对象,每个索引的属性都在有效字节范围内。

BytesLike

BytesLike可以是Bytes或DataHexString。

DataHexString

DataHexstring与HexString是相同的,除了它有偶数个nibbles,因此二进制数据作为字符串是有效的。

HexString

Hexstring是一个字符串,它有一个0x前缀,后面跟着nibbles number类型(例如,不区分大小写的十六进制字符,0-9和a-f)。

Signature

Raw Signature inherits string<DataHexString<65>>

原始签名(Raw Signature)是一种常见的签名格式,其中r, s和v被连接成一个65字节(130 nibble)的DataHexString。

SignatureLike

SignatureLike类似于一个Signature,除了多余的属性可以被省略或者它也可以是一个 Raw Signature。

例如,如果指定了_vs,则s和v可以省略。同样,如果提供了recoveryParam, 则可以省略v(在这种情况下,可以计算出缺失的值)。

检查

ethers.utils.isBytes( object ) ⇒ boolean

当且仅当object为有效Bytes时返回true。

ethers.utils.isBytesLike( object ) ⇒ boolean

当且仅当object是Bytes或DataHexString时返回true。

ethers.utils.isHexString( object , [ length ] ) ⇒ boolean

当且仅当object是一个有效的十六进制字符串时返回true。 如果指定了length并且object 不是一个有效的长度字节的DataHexString,则抛出一个InvalidArgument错误。

数组和十六进制字符串之间的转换

ethers.utils.arrayify( DataHexStringOrArrayish [ , options ] ) ⇒ Uint8Array

将DataHexStringOrArrayish转换为Uint8Array。

ethers.utils.hexlify( hexstringOrArrayish ) ⇒ string< DataHexString >

将hexstringOrArrayish转换为DataHexString。

ethers.utils.hexValue( aBigNumberish ) ⇒ string< HexString >

将aBigNumberish转换为HexString,没有前导零。

Examples
// 将十六进制字符串转换为Uint8Array arrayify("0x1234") // Uint8Array [ 18, 52 ] // 将数组转换为十六进制字符串 hexlify([1, 2, 3, 4]) // '0x01020304' // 将对象转换为十六进制字符串 hexlify({ length: 2, "0": 1, "1": 2 }) // '0x0102' // 将数组转换为十六进制字符串 hexlify([ 1 ]) // '0x01' // 将数字转换成无前导零的十六进制值 hexValue(1) // '0x1' // 将数组转换成无前导零的十六进制值 hexValue([ 1, 2 ]) // '0x102'

数组处理

ethers.utils.concat( arrayOfBytesLike ) ⇒ Uint8Array

将arrayOfBytesLike中的所有BytesLike连接到一个单独的Uint8Array中。

ethers.utils.stripZeros( aBytesLike ) ⇒ Uint8Array

返回一个无前导零aBtyesLike字节的Uint8Array

ethers.utils.zeroPad( aBytesLike , length ) ⇒ Uint8Array

Returns a Uint8Array of the data in aBytesLike with 0 bytes prepended to length bytes long.

如果aBytesLike的长度已经超过长度字节,则会抛出InvalidArgument错误。

十六进制字符串处理

ethers.utils.hexConcat( arrayOfBytesLike ) ⇒ string< DataHexString >

将arrayOfBytesLike中的所有BytesLike连接成一个单一的DataHexString。

ethers.utils.hexDataLength( aBytesLike ) ⇒ string< DataHexString >

返回aBytesLike的长度(以字节为单位)。

ethers.utils.hexDataSlice( aBytesLike , offset [ , endOffset ] ) ⇒ string< DataHexString >

返回一个aBytesLike切片的DataHexString表示,从offset(以字节为单位)到endOffset(以字节为单位)。 如果省略了endOffset,则使用aBytesLike的长度。

ethers.utils.hexStripZeros( aBytesLike ) ⇒ string< HexString >

返回aBytesLike的HexString表示形式,去掉所有前导零。

ethers.utils.hexZeroPad( aBytesLike , length ) ⇒ string< DataHexString >

返回被填充到length字节的aBytesLike的DataHexString表示。

如果aBytesLike的长度已经超过length字节,则会抛出InvalidArgument错误。

签名转换

ethers.utils.joinSignature( aSignatureLike ) ⇒ string< RawSignature >

返回aSignaturelike的原始格式,它是65字节(130个nibbles)长,连接签名的r, s和(标准化后))v。

ethers.utils.splitSignature( aSignatureLikeOrBytesLike ) ⇒ Signature

返回aSignaturelike的完整扩展格式或原始格式DataHexString,将自动计算所有缺失的属性。

随机字节

ethers.utils.randomBytes( length ) ⇒ Uint8Array

返回一个新的Uint8Array 长度为length的随机字节。

ethers.utils.shuffled( array ) ⇒ Array< any >

返回一个使用Fisher-Yates Shuffle打乱后的数组副本。

Examples
utils.randomBytes(8) // Uint8Array [ 30, 216, 23, 134, 85, 198, 30, 109 ] const data = [ 1, 2, 3, 4, 5, 6, 7 ]; // 返回一个新数组 utils.shuffled(data); // [ // 6, // 4, // 1, // 7, // 5, // 2, // 3 // ] // 原数据不会有任何变化 data // [ // 1, // 2, // 3, // 4, // 5, // 6, // 7 // ]