首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将bytes32转换为有序的bytes2、bytes4等

将bytes32转换为有序的bytes2、bytes4等
EN

Ethereum用户
提问于 2017-03-11 14:28:48
回答 1查看 2.8K关注 0票数 3

例如,我需要将我的bytes32变量分割成块,并将结果放入5个变量中,保存顺序、bytes2bytes2bytes2bytes2bytes8bytes1 (又名byte),应该保存顺序,我并不真正关心剩余的字节。

坚固有一些工具吗?或者只有通过位操作才有可能。

我发现在这种低级类型下工作有些困难。

UPDATE:所以我准备了这个函数,它从numBytes字节开始从source解析start字节。

代码语言:javascript
复制
function bytesChunck(bytes32 source, uint start, uint numBytes) constant returns(uint _result){
            uint counter = 0;
            uint result;

            for(uint i = 0; i < numBytes; i++) {
                result += uint8(source[start + i]);
            }
            return result;
            // 
    }

然后,我只需将结果转换为所需的字节,比如bytes8(result)。但是它似乎被溢出了,因为如果我有8个字节,它的第一个字节总是零。有什么想法吗?)

谢谢。

EN

回答 1

Ethereum用户

回答已采纳

发布于 2017-03-31 11:30:12

你的问题不够清楚。当您想将32个字节分割成5个变量,这些变量的总长度为2+2+2+2+8+1 = 17时,您应该指定要分块的字节(左字节或右字节)。

我写了一个例子,尽我所能解决你的问题。注释答案--解释你到底需要什么,我会修改代码。

代码语言:javascript
复制
pragma solidity ^0.4.0;

contract BytesChunkTest
{
    bytes32 constant public test_source=0x000000000000000000ff11223344556677889900aabbccddeeff;

    bytes32 constant mask1 = 0xff00000000000000000000000000000000000000000000000000000000000000;
    bytes32 constant mask2 = 0xffff000000000000000000000000000000000000000000000000000000000000;
    bytes32 constant mask8 = 0xffffffffffffffff000000000000000000000000000000000000000000000000;
    uint    constant main_shift=15;

    function sourceToChunk(bytes32 source) constant
    returns
        (
            bytes2 r1_2,
            bytes2 r2_2,
            bytes2 r3_2,
            bytes2 r4_2,
            bytes8 r5_8,
            bytes1 r6_1
        )
    {

        r1_2 = bytes2(source<<(main_shift*8)&mask2);
        r2_2 = bytes2((source<<(main_shift+2)*8)&mask2);
        r3_2 = bytes2((source<<(main_shift+4)*8)&mask2);
        r4_2 = bytes2((source<<(main_shift+6)*8)&mask2);
        r5_8 = bytes8((source<<(main_shift+8)*8)&mask8);
        r6_1 = bytes1((source<<(main_shift+16)*8)&mask1);
    }


    function test() constant
    returns
        (
            bytes2,
            bytes2,
            bytes2,
            bytes2,
            bytes8,
            bytes1
        )
    {
        return sourceToChunk(test_source);
    }
}
票数 5
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/12976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档