Solidity
將 bytes32 轉換為有序的 bytes2、bytes4 等
例如,我需要將我的 bytes32 變數切成塊,並將結果放入 5 個變數中,保存順序,
bytes2
,bytes2
,bytes2
,bytes2
,bytes8
,bytes1
(akabyte
),順序應該被保存,我並不關心其餘的字節.Solidity 有一些工具嗎?或者只有位操作才有可能。
我發現使用這種低級類型有些困難。
更新:所以我確實準備了這個從字節開始解析
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 個字節,它的第一個字節總是為零。有任何想法嗎?:)謝謝你。
你的問題不夠清楚。當您想將 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); } }