Estoy pasando una matriz de bytes32 a mi función. Esta matriz puede contener números o hashes, etc. para identificar un objeto. En un nuevo caso de uso, quiero pasar una URL a esta función dividiendo la URL en partes convertidas en bytes32. ¿Cómo puedo concatenar los bytes32 individuales para restaurar la URL?
Sé que puedo crear una matriz de bytes y establecer bytes en los índices. Pero no sé cómo puedo acceder a una posición específica en bytes32.
function bytes2string(bytes32[] data) returns (string) {
bytes memory r = new bytes(1);
r[0] = bytes1(data[0]);
return string(r);
}
Gracias a Piper y Chris, encontré una solución funcional para Solidity <= 0.2.1. La razón por la que las dos primeras declaraciones de registro devuelven resultados diferentes es porque uintN está alineado a la derecha y bytesN está alineado a la izquierda. La conversión entre uintN y bytesN primero se acorta y luego cambia la alineación. Es por eso que debe volver a bytes32
convertirse antes de convertirse en byte
:
LogBytes1(byte(data)); // prints "s"
LogBytes1(byte(uint(data))); prints "\x00"
LogBytes1(byte(bytes32(uint(data)))); prints "s"
Una solución probada a mi pregunta es:
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);
}
Puede recuperar el enésimo byte de cualquier bytesXX
tipo con el siguiente código.
bytes32 v = ...;
byte b = byte(bytes32(uint(v) * 2 ** (8 * n)));
A partir de la próxima versión de Solidity, podrá acceder a ellos mediante índices .
bytes32 v = ...;
byte b = v[n];
bytes32
. No estoy seguro si desea mantener esta respuesta o la de abajo.
Wang