¿Hay una manera simple de convertir bytes32
a bytes
Solidity?
Estoy tratando de obtener la longitud de la cadena pasada en la variable bytes32, pero todo se devuelve en tamaño 32, lo que tiene sentido.
Pero la conversión explícita no parece funcionar:
bytes memory _tmpUsername = bytes(_username); // _username is of type bytes32
Esto arroja un error de:
Explicit type conversion not allowed from "bytes32" to "bytes storage pointer"
Dado solidity@0.4.22
que , puede usar abi.encodePacked()
para esto, que devuelve bytes
. Por ejemplo ;
contract C {
function toBytes(bytes32 _data) public pure returns (bytes) {
return abi.encodePacked(_data);
}
}
Aquí hay un método totalmente ineficiente para convertir bytes32 en bytes (mientras se eliminan los bytes de ceros adicionales a la derecha).
function bytes32ToBytes(bytes32 data) internal pure returns (bytes) {
uint i = 0;
while (i < 32 && uint(data[i]) != 0) {
++i;
}
bytes memory result = new bytes(i);
i = 0;
while (i < 32 && data[i] != 0) {
result[i] = data[i];
++i;
}
return result;
}
Puede usar bytes.concat
en lugar de abi.encodePacked
.
function toBytes(bytes32 data) public pure returns (bytes memory) {
return bytes.concat(data);
}
Tengo entendido que bytes.concat
finalmente reemplazará a abi.encodePacked
.
Usando el ensamblaje en línea, puede copiar bytes32
a una bytes
estructura como esta:
function bytes32ToBytes(bytes32 input) public pure returns (bytes memory) {
bytes memory b = new bytes(32);
assembly {
mstore(add(b, 32), input) // set the bytes data
}
return b;
}
Ayrton Senna
ismael