Solidity

如何連接 bytes32數組到字元串?

  • February 14, 2016

我正在將一個 bytes32 數組傳遞給我的函式。該數組可以包含數字或雜湊等來標識對象。在一個新的案例中,我想通過將 URL 拆分為轉換為 bytes32 的部分來將 URL 傳遞給該函式。如何連接單個 bytes32 以恢復 URL?

我知道我可以創建一個字節數組並在索引處設置字節。但我不知道如何訪問 bytes32 中的特定位置。

function bytes2string(bytes32[] data) returns (string) {
   bytes memory r = new bytes(1);
   r[0] = bytes1(data[0]);
   return string(r);
}

感謝 Piper 和 Chris,我找到了 Solidity <= 0.2.1 的可行解決方案。前兩個日誌語句返回不同結果的原因是,因為 uintN 是右對齊的,而 bytesN 是左對齊的。uintN 和 bytesN 之間的轉換首先縮短然後更改對齊方式。這就是為什麼它必須在轉換為bytes32之前轉換回byte

LogBytes1(byte(data)); // prints "s"
LogBytes1(byte(uint(data))); prints "\x00"
LogBytes1(byte(bytes32(uint(data)))); prints "s"

我的問題經過測試的解決方案是:

function bytes32ArrayToString (bytes32[] data) returns (string) {
   bytes memory bytesString = new bytes(data.length * 32);
   uint urlLength;
   for (uint i=0; i&lt;data.length; i++) {
       for (uint j=0; j&lt;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&lt;urlLength; i++) {
       bytesStringTrimmed[i] = bytesString[i];
   }
   return string(bytesStringTrimmed);
}

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