首页 > 其他分享 >『0013』 - Solidity Types - 固定大小字节数组(Fixed-size byte arrays)

『0013』 - Solidity Types - 固定大小字节数组(Fixed-size byte arrays)

时间:2023-04-08 17:01:56浏览次数:58  
标签:0110 0111 0013 字节 arrays Solidity 0101 1100 1001

作者:黎跃春,

固定大小字节数组(Fixed-size byte arrays)

固定大小字节数组可以通过 bytes1, bytes2, bytes3, …, bytes32来进行声明。PS:byte的别名就是 byte1

  • bytes1只能存储一个字节,也就是二进制8位的内容。
  • bytes2只能存储两个字节,也就是二进制16位的内容。
  • bytes3只能存储三个字节,也就是二进制24位的内容。
  • ……
  • bytes32能存储三十二个字节,也就是二进制32 * 8 = 256位的内容。
pragma solidity ^0.4.4;

contract C {

    // 0x6c697975656368756e

    byte public a = 0x6c; // 0110 1100
    bytes1 public b = 0x6c; // 0110 1100
    bytes2 public c = 0x6c69; // 0110 1100 0110 1001
    bytes3 public d = 0x6c6979; // 0110 1100 0110 1001 0111 1001
    bytes4 public e = 0x6c697975; // 0110 1100 0110 1001 0111 1001 0111 0101

    // ...

    bytes8 public f = 0x6c69797565636875; // 0110 1100 0110 1001 0111 1001 0111 0101 0110 0101 0110 0011 0110 1000 0111 0101
    bytes9 public g = 0x6c697975656368756e; // // 0110 1100 0110 1001 0111 1001 0111 0101 0110 0101 0110 0011 0110 1000 0111 0101 0110 1110

}

说明

0x 6c 69 79 75 65 63 68 75 6e是一个十六进制的整数,它的二进制码是0b 0110 1100 0110 1001 0111 1001 0111 0101 0110 0101 0110 0011 0110 1000 0111 0101 0110 1110,在计算机中0b 0110 1100 0110 1001 0111 1001 0111 0101 0110 0101 0110 0011 0110 1000 0111 0101 0110 1110二进制码存储的内容其实就是liyuechun我名字的全拼。我们都知道,在计算机中,所以的内容,不管是图片、文字、视频,任何资料我们都可以转换成二进制码在计算机中进行存储。

在计算机中,一个字母或者一个数字的存储空间为一个字节,也就是8位二进制位。一个汉字两个字节,也就是16位

0x6c697975656368756e中,0x6c是一个字节,因为16进制中,一个数字等价于二进制中的4位,两个数字等价于8位,刚好一个字节,0x6c用二进制来表示是0b 0110 11000x6c对应的内容为l,而0x6c69对应的内容为li,以此内推0x6c697975656368756e对应的内容为liyuechun

PS:

bytebytes1等价,只能存储一个字节,当超过它的存储范围时就会报错,如下图所示:

操作运算符

  • 比较运算符:<=, <, ==, !=, >=, >
pragma solidity ^0.4.4;

contract C{ 

    // 0x 6c 69 79 75 65 63 68 75 6e  -> liyuechun


    // 1 2 3 4 5 6 7 8 9 A B C D E F 

    bytes1 b10 = 0x6c; // l -> 0110 1100  -> 12 * 1 + 6 * 16  = 108
    bytes1 b11 = 0x69; // i -> 0110 1001  -> 9 * 1 + 6 * 16 = 105


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

    function test1() constant returns (bool) {

        return b10 <= b11; // false
    }


    function test2() constant returns (bool) {

        return b10 < b11; // false
    }

    function test3() constant returns (bool) {

        return b10 == b11; // false
    }

    function test4() constant returns (bool) {

        return b10 >= b11; // true
    }

    function test5() constant returns (bool) {

        return b10 > b11; // true
    }  
}
  • 位操作符:&, |, ^(异或), ~ (取反), << (左移), >> (右移)
pragma solidity ^0.4.4;

contract C{ 

    // 0x 6c 69 79 75 65 63 68 75 6e  -> liyuechun


    // 1 2 3 4 5 6 7 8 9 A B C D E F 

    bytes1 b10 = 0x6c; // l -> 0110 1100  -> 12 * 1 + 6 * 16  = 108
    bytes1 b11 = 0x69; // i -> 0110 1001  -> 9 * 1 + 6 * 16 = 105


    //   &, |, ^(异或), ~ (取反), << (左移), >> (右移)


    function test1() constant returns (bytes1) {

        return b10 & b11;
        // 0110 1100 -> 0x6c
        // 0110 1001 -> 0x69
        // 0110 1000 -> 0x68
    }

    function test2() constant returns (bytes1) {

        return b10 | b11;
        // 0110 1100 -> 0x6c
        // 0110 1001 -> 0x69
        // 0111 1101 -> 0x6d
    }

    function test3() constant returns (bytes1) {

        return ~b10;
        // 0110 1100 -> 0x6c
        // 1001 0011 -> 0x93
    }

    function test4() constant returns (bytes1) {

        return b10 << 1;
        // 0110 1100 -> 0x6c
        // 1101 1000 -> 0xd8
    }

     function test5() constant returns (bytes1) {

        return b10 >> 1;
        // 0110 1100 -> 0x6c
        // 0011 0110 -> 0x36
    } 
}
  • 索引访问:如果x是一个bytesI,那么可以通过x[k](0 < k < I)获取对应索引的字节,**PS:**x[k]是只读,不可写。

成员函数

  • .length 返回字节的个数。(只读)
pragma solidity ^0.4.4;

contract C {

    bytes9 public g = 0x6c697975656368756e;

    function gByteLength() constant returns (uint) {

        return g.length;
    }

}

不可变深度解析

长度不可变

pragma solidity ^0.4.4;

contract C {


    bytes9  name = 0x6c697975656368756e;

    function setNameLength(uint length) {

        // 报错
        name.length = length;
    }

}

内部字节不可修改

pragma solidity ^0.4.4;

contract C {


    bytes9  name = 0x6c697975656368756e;

    function setNameFirstByte(byte b) {

        name[0] = b;
    }

}

总结

bytesI(1 <= I <= 32)可以声明固定字节大小的字节数组变量,一旦声明,内部的字节和字节数组长度不可修改,当然可以通过索引读取(只读)对应索引的字节,或者通过length读取字节数组的字节数。

技术交流

  • 区块链技术交流QQ群:348924182
  • 「区块链部落」官方公众号


标签:0110,0111,0013,字节,arrays,Solidity,0101,1100,1001
From: https://blog.51cto.com/u_10981011/6177812

相关文章

  • 『0015』 - Solidity Types - (Dynamically-sized byte array)、(Fixed-size byte arrays
    作者:黎跃春,大纲固定大小字节数组(Fixed-sizebytearrays)之间的转换固定大小字节数组(Fixed-sizebytearrays)转动态大小字节数组(Dynamically-sizedbytearray)固定大小字节数组(Fixed-sizebytearrays)不能直接转换为string动态大小字节数组(Dynamically-sizedbytearray)转stri......
  • 『0008』- Solidity中public、internal、private在状态变量和函数中的使用以及Solidit
    作者:黎跃春,在上一小节中我们在函数参数中使用storage这个关键字时,当前的函数必须是internal或者private类型。在本小节中,我(微信:liyc1215)将重点为大家介绍属性和函数的使用权限。状态变量、函数的权限一、public备注:为了演示方便,我直接通过https://remix.ethereum.org/来进行演示。p......
  • 『0004』- 基于Ethereum Wallet的Solidity HelloWorld智能合约(Smart Contract)
    作者:黎跃春,相信大家都有学习各种开发语言的经历,一般学习任何一门语言都会先从最简单的HelloWorld开始,所以本篇文章,我们将编写一个最基本的合约代码,并且一步步讲解如何通过EthereumWallet将合约部署到区块链,同时我们将通过本demo的演示如何通过发送数据和接收数据和合约进行交互。S......
  • 『0014』 - Solidity Types - 动态大小字节数组(Dynamically-sized byte array)
    作者:黎跃春,一、Dynamically-sizedbytearraystring是一个动态尺寸的UTF-8编码字符串,它其实是一个特殊的可变字节数组,string是引用类型,而非值类型。bytes动态字节数组,引用类型。根据经验,在我们不确定字节数据大小的情况下,我们可以使用string或者bytes,而如果我们清楚的知道或者......
  • 『0018』 - Solidity Types - Solidity 结构体(Structs)
    作者:黎跃春,自定义结构体pragmasolidity^0.4.4;contractStudents{structPerson{uintage;uintstuID;stringname;}}Person就是我们自定义的一个新的结构体类型,结构体里面可以存放任意类型的值。初始化一个结构体初始化一个storage......
  • Arrays.stream().boxed()的使用
    Arrays.stream().boxed()的使用0.写在前面1.Arrays.stream()的使用算法:代码:输出结果:2.boxed()的使用boxed()方法实现在原始类型「primitives」和盒式类型「boxed」之间转换数组3.参考0.写在前面文章翻译自以下本文的最后链接1.Arrays.stream()的使用算法:获取要转换的数组。使......
  • 如何在Solidity中建立DAO(去中心化自治组织)?
    本文将帮助您理解DAO的概念,并帮助您构建一个基本的DAO。什么是DAO?您可以将DAO视为基于互联网的实体(比如企业),由其股东(拥有代币和比例投票权的成员)共同拥有和管理。在DAO中,决策是通过提案做出的,DAO的成员可以对这些提案进行投票,然后执行它们。DAO完全由可公开查看/可验......
  • java方法-Arrays类
    Arrays类数组的工具类java.util.Arrays由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作查看JDK帮助文档Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,......
  • 练习——Arrays类小练
    packagecom.arrays_;importjava.util.Arrays;importjava.util.Comparator;publicclassArraysExercise{publicstaticvoidmain(String[]args){/*案例:自定义Book类,里面包含name和price,按price排序(从大到小)。要求使用两种方式排......
  • solidity学习记
    合约的实例会一直运行在区块链上吗合约的实例不会一直运行在区块链上,而是在执行完交易后,将其状态存储在区块链上。当需要访问合约时,可以通过调用其函数来重新激活它,执行相......