例如,我需要将我的bytes32变量分割成块,并将结果放入5个变量中,保存顺序、bytes2、bytes2、bytes2、bytes2、bytes8、bytes1 (又名byte),应该保存顺序,我并不真正关心剩余的字节。
坚固有一些工具吗?或者只有通过位操作才有可能。
我发现在这种低级类型下工作有些困难。
UPDATE:所以我准备了这个函数,它从numBytes字节开始从source解析start字节。
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个字节,它的第一个字节总是零。有什么想法吗?)
谢谢。
发布于 2017-03-31 11:30:12
你的问题不够清楚。当您想将32个字节分割成5个变量,这些变量的总长度为2+2+2+2+8+1 = 17时,您应该指定要分块的字节(左字节或右字节)。
我写了一个例子,尽我所能解决你的问题。注释答案--解释你到底需要什么,我会修改代码。
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);
}
}https://ethereum.stackexchange.com/questions/12976
复制相似问题