字节处理

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

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

类型

Bytes

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

BytesLike

BytesLike可以是BytesDataHexString

DataHexString

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

HexString

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

Signature

Raw Signature inherits string<DataHexString<65>>

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

SignatureLike

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

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

检查

ethers.utils.isBytes( object ) boolean

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

ethers.utils.isBytesLike( object ) boolean

当且仅当objectBytesDataHexString时返回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 >

返回aBytesLikeHexString表示形式,去掉所有前导零。

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

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

如果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 // ]