Solidity
如何連接 bytes32數組到字元串?
我正在將一個 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<data.length; i++) { for (uint j=0; j<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<urlLength; i++) { bytesStringTrimmed[i] = bytesString[i]; } return string(bytesStringTrimmed); }