LOADING

深入了解 Solidity bytes

In-depth knowledge Solidity bytes

电报联系方式

无论您使用固定大小的bytesN还是动态大小的bytes数组,bytes在Solidity中都扮演着重要的角色。在本文中,我们将研究它们之间的差异,深入探讨与固定大小数组bytesN相关的位操作,并展示如何使用bytes执行一些通用操作,比如连接。

深入了解 Solidity bytes

Solidity中的字节数据布局

关于端(Endianness )

在计算机中,术语 “端”(endianness)用来说明数据的低位字节的存储和排序方式。因此,它定义了计算机或机器存储的内部排序。

多字节数据类型,如uint、float、string等,可以以两种不同的字节排序方式存储在计算机中:大端格式和小端格式。

在大端格式下,多字节数据类型的二进制表示中,最高位字节(即第一个字节)被首先存储。

而在小端格式下,多字节数据类型的二进制表示中,最低位字节(即最后一个字节)被首先存储。这种方式在英特尔x86体系结构的计算机中广泛使用。

深入了解 Solidity bytes

Solidity 中的字节数据布局

以太坊虚拟机(EVM)采用大端格式,这意味着在EVM中,所有数据都以大端格式存储。无论数据的Solidity类型如何,EVM内部都使用32字节的字来处理数据。

然而,数据的布局取决于其类型(如bytesN、uintN、address等),这指的是数据的高位字节放置方式。

在以太坊和 Solidity 开发者社区中,这被称为填充规则:左填充与右填充。

以下是Solidity中使用的填充规则:

  • 使用**右填充(right-padded)**类型: stringbytes . bytesN.
  • 使用**左填充(left-padded)**类型:intN / uintN (有符号/无符号整数)、 address 和其他类型。

例如,Solidity 中的 string value = "abcd" 字符串将被 EVM 填充为一个完整的 32 字节, 0 填充在右侧。

0x6162636400000000000000000000000000000000000000000000000000000000

相反,Solidity 中的数字 uint256 value = 1_633_837_924(= 0x61626364 十六进制)被 EVM 填充为一个完整的 32 字节时。0 将被填充在左边:

0x0000000000000000000000000000000000000000000000000000000061626364

深入研究数据布局和填充规则对于理解在 Solidity 中处理不同数据类型的方式至关重要,特别是在处理 bytesN 及其关联的 uintN 类型时。举例来说,尽管 bytes1 和 uint8 具有相同的位大小,但它们的内部表示方式是不同的。请参考以下代码片段。

// 0x00000000…01
Uint8 a = 1;

// 0x01000000….
byte b = 1;
bytes1 c =

本文主要讨论 bytesN . bytes 类型。Solidity 提供了两种字节类型:

  • 固定大小的字节数组:bytesN
  • 动态大小的字节数组: bytes,表示字节序列。

固定大小的字节数组

您可以使用关键字 bytesX 来声明变量,其中 X 代表字节数,范围从 1 到 32。

bytebytes1 的别名,它表示存储单个字节的数据。

如果您的需求可以限制在特定字节数内,请尽量使用 bytes1bytes32 中的其中一个,因为它们更经济高效。

使用具有固定大小的字节数变量可以方便合约之间的数据传递。

动态调整字节数组大小

bytes

bytes 用于表示任意长度的原始字节数据。

在 Solidity 中,bytes 表示字节的动态数组,它实际上是 byte[] 的简写。

需要注意的是,bytes 不是一个值类型,而是一个动态数组类型。这意味着它可以具有零长度,也可以在其末尾添加字节。

string

bytes32 someString = “stringliteral”;

当将字符串常量赋值给 bytes32 类型时,它将以原始字节的形式进行解释。

然而,需要注意的是字符串不能在合约之间传递,因为它们不是固定大小的变量。

尽管 Solidity 本身没有提供丰富的字符串操作函数(除了 concat),但你可以使用第三方字符串库来扩展字符串处理功能。

Solidity 中的位运算

比较运算符

以下用于字节的比较运算符的值为 bool 值: true or false .

<=, <, ==, !=, >=, >

位运算符

Solidity 中提供了以下位运算符: & (与), | (或), ^ (异或) . ~ (非).

为简单起见,我们将对两个变量使用 bytes1 数据类型(等于 byte ).a.b。我们将在 Solidity 中使用它们的十六进制表示法来初始化它们。

bytes1 a = 0xb5; // [10110101]
bytes1 b = 0x56; // [01010110]

下表显示了它们的二进制格式。

深入了解 Solidity bytes

& (with) : 两个位都必须是 1(白色行),结果才为 true(1 => 黄色行)。

深入了解 Solidity bytes

a & b; // Result: 0x14 [00010100]

开发联系:DEXDAO

 

© 版权声明

Related posts

No comments

No comments...