区块链:Solidity值类型(String字符串、固定大小字节数组、动态大小字节数组之间的转换)

2023-10-27

固定大小字节数组(Fixed-size byte arrays)之间的转换

pragma solidity ^0.4.4;

contract C {


   bytes9 name9 = 0x6c697975656368756e;


   function bytes9ToBytes1() constant returns (bytes1) {

       return bytes1(name9);
   }

   function bytes9ToBytes2() constant returns (bytes2) {

       return bytes2(name9);
   }

   function bytes9ToBytes32() constant returns (bytes32) {

       return bytes32(name9);
   }

}

结论:当bytes9bytes1或者bytes2时,会进行低位截断0x6c697975656368756e转换为bytes1,结果为0x6c,转换为bytes2时结果为0x6c69。当0x6c697975656368756e转换为bytes32时会进行低位补齐,结果为0x6c697975656368756e0000000000000000000000000000000000000000000000

固定大小字节数组(Fixed-size byte arrays)转动态大小字节数组(Dynamically-sized byte array)

pragma solidity ^0.4.4;

contract C {
   bytes9 name9 = 0x6c697975656368756e;
   function fixedSizeByteArraysToDynamicallySizedByteArray() constant returns (bytes) {
       return bytes(name9);
   }

}

编译运行时,代码报错;

备注:固定大小字节数组和动态大小字节数组之间不能简单直接转换

下面是固定大小字节数组转动态大小字节数组正确的姿势

pragma solidity ^0.4.4;

contract C {

   bytes9 name9 = 0x6c697975656368756e;

   function fixedSizeByteArraysToDynamicallySizedByteArray() constant returns (bytes) {

       bytes memory names = new bytes(name9.length);

       for(uint i = 0; i < name9.length; i++) {

           names[i] = name9[i];
       }

       return names;
   }

}

在上面的代码中,我们根据固定字节大小数组的长度来创建一个memory类型的动态类型的字节数组,然后通过一个for循环将固定大小字节数组中的字节按照索引赋给动态大小字节数组即可。

固定大小字节数组(Fixed-size byte arrays)不能直接转换为string

pragma solidity ^0.4.4;

contract C {

    bytes9 names = 0x6c697975656368756e;

    function namesToString() constant returns (string) {

        return string(names);
    }

}

报错

动态大小字节数组(Dynamically-sized byte array)转string

重要:因为string特殊的动态字节数组,所以string只能和动态大小字节数组(Dynamically-sized byte array)之间进行转换不能和固定大小字节数组进行转换

  • 如果是现成的动态大小字节数组(Dynamically-sized byte array),如下:
pragma solidity ^0.4.4;

contract C {

    bytes names = new bytes(2);

    function C() { 
        names[0] = 0x6c;
        names[1] = 0x69;
    }

    function namesToString() constant returns (string) {

        return string(names);
    }

}
  • 如果是固定大小字节数组转string,那么就需要先将字节数组转动态字节数组,再转字符串
  • 正确的固定大小字节数组转string的代码
pragma solidity ^0.4.4;

contract C {

    function bytes32ToString(bytes32 x) constant returns (string) {
        bytes memory bytesString = new bytes(32);
        uint charCount = 0;
        for (uint j = 0; j < 32; j++) {
            byte char = byte(bytes32(uint(x) * 2 ** (8 * j)));
            if (char != 0) {
                bytesString[charCount] = char;
                charCount++;
            }
        }
        bytes memory bytesStringTrimmed = new bytes(charCount);
        for (j = 0; j < charCount; j++) {
            bytesStringTrimmed[j] = bytesString[j];
        }
        return string(bytesStringTrimmed);
    }

    function bytes32ArrayToString(bytes32[] data) constant returns (string) {
        bytes memory bytesString = new bytes(data.length * 32);
        uint urlLength;
        for (uint i = 0; i< data.length; i++) {
            for (uint j = 0; j < 32; j++) {
                byte char = byte(bytes32(uint(data[i]) * 2 ** (8 * j)));
                if (char != 0) {
                    bytesString[urlLength] = char;
                    urlLength += 1;
                }
            }
        }
        bytes memory bytesStringTrimmed = new bytes(urlLength);
        for (i = 0; i < urlLength; i++) {
            bytesStringTrimmed[i] = bytesString[i];
        }
        return string(bytesStringTrimmed);
    }    
}

byte char = byte(bytes32(uint(x) * 2 ** (8 * j)))在上面的代码中,估计大家最难看懂的就是这一句代码,我们通过下面的案例给大家解析:

pragma solidity ^0.4.4;

contract C {

    // 0x6c

    function uintValue() constant returns (uint) {

        return uint(0x6c);
    }

    function bytes32To0x6c() constant returns (bytes32) {

        return bytes32(0x6c);
    }

    function bytes32To0x6cLeft00() constant returns (bytes32) {

        return bytes32(uint(0x6c) * 2 ** (8 * 0));
    }

    function bytes32To0x6cLeft01() constant returns (bytes32) {

        return bytes32(uint(0x6c) * 2 ** (8 * 1));
    }

    function bytes32To0x6cLeft31() constant returns (bytes32) {

        return bytes32(uint(0x6c) * 2 ** (8 * 31));
    }
}
  • bytes32(uint(0x6c) * 2 ** (8 * 31));左移31
  • bytes32(uint(0x6c) * 2 ** (8 * 1)); 左移1
  • 通过byte(bytes32(uint(x) * 2 ** (8 * j)))获取到的始终是第0个字节。

总结
string本身是一个特殊的动态字节数组,所以它只能和bytes之间进行转换,不能和固定大小字节数组进行直接转换,如果是固定字节大小数组,需要将其转换为动态字节大小数组才能进行转换。

原文链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

区块链:Solidity值类型(String字符串、固定大小字节数组、动态大小字节数组之间的转换) 的相关文章

  • uniswap 程序集 create2 功能如何工作?

    我正在查看 uniswap 代码 试图理解代码 其中大部分内容都非常清楚 但我确实有一些问题 在这个函数中 function createPair address tokenA address tokenB external returns
  • 更改对象上的修改子句错误

    我怎样才能 用达夫尼语 陈述 ensures 保证方法返回的对象将是 新的 即不会与其他地方使用的对象相同 尚未 以下代码显示了一个最小的示例 method newArray a array
  • 区块链交易平台服务器该怎么选

    区块链交易平台服务器该怎么选 随着互联网技术的发展 区块链也发展成为一种潮流 越来越多的人加入到区块链行业中来 尤其是区块链交易平台 但也有很多人不了解区块链对服务器的要求 那么我们就要好好说说搭建区块链交易平台服务器该怎么选 1 区块链交
  • 扬帆证券:玻璃期价涨势强劲 投资者需理性看待

    上个交易周 国内产品期货商场全体工作平稳 其间 玻璃期货体现较为出色 主力合约上星期五午后忽然大幅拉升 毕竟收涨逾7 周内累计涨幅超越10 业内人士以为 近期玻璃期价走势强劲主要是受地产政策利好和本钱增加的推动 后市行情或将偏震动 上涨持续
  • 默克尔树(Merkle Tree)

    默克尔树 Merkle Tree 是一种哈希树的变体 它是一种有向无环图 DAG 通常用于数据完整性验证 它以密码学家拉尔夫 默克尔的名字命名 是由一系列哈希值构成的树状结构 默克尔树的特点是 它的每个非叶子节点都是其子节点的哈希值的哈希
  • Solidity之旅(七)单位以及全局变量

    01 以太币单位 Ether 甭管是虚拟货币还是现实中的 稳定币 他们都有各自的货币单位 当然咯 作为以太坊区块链上交易的虚拟货币以太坊也是有属于自己的那一套货币单位的 而目前以太币 Ether 主要分为这三个 wei gwei以及ethe
  • NFTScan | 12.11~12.17 NFT 市场热点汇总

    欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总 周期 2023 12 11 2023 12 17 NFT Hot News 01 Pudgy Penguins 衍生 NFT Lil Pudgys 过去一天
  • 在区块链中看CHAT的独特见解

    问CHAT 谈谈对区块链以及区块链金融的理解 CHAT回复 区块链是一种去中心化的分布式数据库技术 这种技术通过加密算法 使数据在网络中传输和存储的过程变得更加安全可靠 区块链的出现引领了存储 交易等形式的革命 改变了诸多行业的运作模式 首
  • 以太坊 Solidity 中的划分

    我正在创建一个发行代币的合约 我希望持有代币的账户能够检查他们拥有的所有代币所占的百分比 我知道以太坊还没有实现浮点数 我应该怎么办 在客户端而不是在 Solidity 中执行该计算可能是最好的 最低的 Gas 成本并且实施起来很简单 如果
  • 期货和期权哪个风险更大?有哪些相同和不同的地方?

    期货和期权这两个都是高风险 高收益的投资工具是两个相同的部分 而期货呢是保证金交易理论上亏损是无限的 而期权呢买入期权的话最大亏损也就是权利金 这个是两者的最大区别 下文科普期货和期权哪个风险更大 有哪些相同和不同的地方 本文来自 期权酱
  • 你的服务器还安全吗?用户数据是否面临泄露风险?

    一系列严重的网络安全事件引起了广泛关注 多家知名公司的服务器遭到黑客挟持 用户的个人数据和敏感信息面临泄露的风险 这些事件揭示了网络安全的脆弱性和黑客攻击的威胁性 提醒着企业和个人加强对网络安全的重视 一 入侵案例 1 1 蔚来数据泄露 1
  • 如何访问具有数组类型值的 Solidity 映射?

    我定义了一个映射类型的状态变量 例如映射 uint256 gt uint256 我想将其公开 以便我可以从合同之外访问它 但是编译器报错TypeError Wrong argument count for function call 1 a
  • web3.js如何搜索所有曾经创建的合约并查看地址

    我是 web3 js 和 Solidity 的新手 我的问题与我们在区块链上搜索的方式有关 如果我们知道合约地址 就很容易搜索特定合约 然而 我们如何使用最初用于创建合约的地址来查找和识别特定类型的合约 例如 我有一个合同 Contract
  • 如何获取交易结果和状态

    我正在尝试使用以太坊区块链和 Solidity 合约 我目前正在部署合约并对其执行一些操作 但我想知道如何获取特定交易的一些 反馈 回调 返回 例如 有没有办法将事务的状态设置为 0 错误 并仍然获取事件 if id length lt 0
  • 使用 ethers js 运行安全帽测试时,合约事件侦听器不会触发

    这是一个非常小的存储库来显示该问题 https github com adamdry ethers event issue https github com adamdry ethers event issue 但我也会在这里解释一下 这是
  • ERC721:转账调用者不是所有者也不是批准的

    我有一个 nftToken 合约 可以将代币铸造到 msg sender 然后我在市场合约中有一个函数 可以将 nft 从所有者转移到市场合约 但是 我收到一条错误消息 ERC721 转账调用者不是所有者也不是批准的 这是我的 nftCon
  • RuntimeError:使用 docker 关闭连接后无法重用套接字

    我正在关注本教程 https github com getamis eth indexer blob master README md fbclid IwAR3g3SAjJ9ik hHCFkol2k8YXo0GvBL15oSNC hIU38
  • ERC20:津贴不足

    我创建了两个代币 YAY e sYAY 和一个 StakeRewards 智能合约 代码如下 SPDX License Identifier MIT pragma solidity 0 8 0 import openzeppelin con
  • 在 Solidity 中初始化一个大的固定长度数组

    我正在以太坊上构建一个游戏作为我的第一个项目 但我面临着存储和天然气限制 我想在区块链上存储一个存储智能合约 以便在部署后查询 我确实需要使用手动插入的常量值来初始化固定长度数组 我的情况如下 contract A some states
  • Solidity 中的地址(0)是什么

    谁能向我解释一下什么address 0 是在 Solidity 中吗 我在文档中找到了以下内容 但对我来说并没有真正意义 如果目标账户是零账户 地址为0的账户 则交易创建一个新合约 如前所述 该合约的地址不是零地址 而是从发送方及其发送的交

随机推荐

  • Bus error (core dumped)问题

    问题描述 项目中有多线程的操作 一个线程运行没有问题 两个线程同时运行时 出现报错 Bus error core dumped 原因分析 问题的原因 指针的中赋值与内容拷贝的问题 业务逻辑中有图像数据的拷贝过程 图像数据是unsinged
  • Mysql之视图、索引【第五篇】

    大纲 一 视图 1 什么是视图 1 MySQL 视图 View 是一种虚拟的表 是从数据库中一个或多个表中导出来的表 视图由列和行构成 行和列的数据来自于定义视图的查询中所使用的表 并且还是在使用视图时动态生成的 2 数据库中存放了视图的定
  • ipfs使用二进制文件部署私有链

    注 此版本仅适用于ipfs go ipfs v0 4 18 版本 IPFS多节点 才能构建一个本地的分布式文件系统 在联盟链开发环境下 多数会使用到IPFS多节点私有网存储文件 一 IPFS二进制安装 1 1 下载ipfs二进制文件 wge
  • Python接口自动化测试之详解post请求

    前言 在HTTP协议中 与get请求把请求参数直接放在url中不同 post请求的请求数据需通过消息主体 request body 中传递 且协议中并没有规定post请求的请求数据必须使用什么样的编码方式 所以其请求数据可以有不同的编码方式
  • wpscloudsvr.exe 怎么删除

    WPS Office安装之后 一直很卡 主要是wpscloudsvr exe这个登录账号的进程太卡了 把它禁止了就行了 1 打开 任务管理器 gt 服务 gt 找到 wpscloudsvr 右键 停止 2 先打开wps 任务管理器 gt 进
  • python 使用 pymssql 调用存储过程并让他返回值

    众所周知 pymssql 库并不支持 暂时 调用存储过程 只能使用原生的sql 语句让其调用 这样一来如果需要让pymssql调用存储过程并让其返回值 显然return语句是不能用了 但是我们可以使用 select 语句让其返回值 比如 我
  • Redis之key和value可以存储的最大值

    文章目录 Redis之key和value可以存储的最大值 1 Redis的key可以存储的最大值 2 Redis的value可以存储的最大值 Redis之key和value可以存储的最大值 1 Redis的key可以存储的最大值 虽然Key
  • ue4文档学习进度

    由于Ue4文档很多 有时又间隔一段时间再看 忘了在哪里了 所以先记录下 截至2022年1月18日 触发器Actor https docs unrealengine com 4 26 zh CN Basics Actors Triggers
  • STM32野火指南者中断EXTI按键点灯

    一 野火官方中断框图 1 输入线 外部中断选择 如 EXTI0 EXTI19 2 配置中断所需寄存器 如 GPIO EXTI NVIC 3 按键1按键2 采用上升沿 下降沿触发 自己设定 二 编程顺序 1 初始化GPIO 即连接到EXTI的
  • [Android学习] 1. 简易登录界面设计

    通过对活动及控件的学习 今天制作一个简易登录界面 简要记录一下操作过程 遇到的问题及学到的经验 希望各位老师多多提出问题不吝赐教 预期设计效果图 设计要求 1 布局不限 参考上图 2 利用EditText制作输入框 有语言提示 3 登录注册
  • 浅谈企业微信公域到私域流量玩法

    一 搭建私域流量池 高效引流客户 客户通过渠道活码添加员工 自动打标签 实时统计引流情况 发送个性化的欢迎语 第一时间送上问候 二 将企业公域流量引流裂变为私域 生成引流裂变海报 通过老用户奖励式分享拉新 实现用户指数级增长 加强用户联系
  • AMD GPU安装运行stable diffusion

    本文操作环境为Windows10 11 AMD AI绘画是一种利用人工智能技术进行绘画的方法 它可以通过机器学习算法来学习艺术家的风格 并生成类似于艺术家的作品 最近 AI绘画技术得到了很大的发展 许多公司和研究机构都在进行相关的研究和开发
  • [C-SAE] SPAT解析消息及说明

    1 消息内容
  • PyTorch 训练一个分类器

    文章目录 0 前言 1 加载和规范化CIFAR10 2 定义一个卷积网络 3 定义损失函数和优化器 4 训练网络 5 测试网络 6 在GPU上训练模型 参考资料 0 前言 TRAINGING A CLASSIFIER 这篇教程很清楚的描述了
  • Visual Studio 2017 许可证已过期解决方案

    参考文章 https blog csdn net qq 19678579 article details 76692822
  • 防缓存穿透利器-隆过滤器(BloomFilter)

    防缓存穿透利器 布隆滤器 BloomFilter 一 布隆过滤器原理 如果想要判断一个元素是不是在一个集合中存在 一般的想法是将所有元素保存起来 然后再拿着这个元素在集合中一个一个进行比对 但是随着集合中元素的增加 我们需要的存储空间越来越
  • java实现九九乘法表

    以下仅是我自己的想法 小伙伴们有其他一些好的想法希望多多交流 以上是九九乘法表的运行图 从上图可以分析出 应该使用二重循环 由我之前的文章可知 二重循环外层控制行数 内层控制列数 所以一共有九行九列的二重循环 根据上图 可以很快写出如下代码
  • Java实现分数

    自己独立实现的 如果有bug或者错误 欢迎评论区留言 文章目录 文档 代码 文档 字段摘要 修饰符 字段 解释 static final Fraction ONE 分数 1 分子 分母都是1的分数 static final Fraction
  • URL——详解

    什么是URL URL 是 统一资源定位符 Uniform Resource Locator 的首字母缩写 中文译为 网址 表示各种资源的互联网地址 下面就是一个典型的 URL https www example com path index
  • 区块链:Solidity值类型(String字符串、固定大小字节数组、动态大小字节数组之间的转换)

    固定大小字节数组 Fixed size byte arrays 之间的转换 pragma solidity 0 4 4 contract C bytes9 name9 0x6c697975656368756e function bytes9