Solidity

將 bytes32 轉換為有序的 bytes2、bytes4 等

  • July 22, 2017

例如,我需要將我的 bytes32 變數切成塊,並將結果放入 5 個變數中,保存順序,bytes2, bytes2, bytes2, bytes2, bytes8, bytes1(aka byte),順序應該被保存,我並不關心其餘的字節.

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);
   }
}

引用自:https://ethereum.stackexchange.com/questions/12976