Ich übergebe ein Array von bytes32 an meine Funktion. Dieses Array kann Zahlen oder Hashes usw. enthalten, um ein Objekt zu identifizieren. In einem neuen Anwendungsfall möchte ich eine URL an diese Funktion übergeben, indem ich die URL in Teile aufteile, die in Bytes32 konvertiert werden. Wie kann ich die einzelnen Bytes32 verketten, um die URL wiederherzustellen?
Ich weiß, dass ich ein Byte-Array erstellen und Bytes an Indizes setzen kann. Aber ich weiß nicht, wie ich auf eine bestimmte Position in einem bytes32 zugreifen kann.
function bytes2string(bytes32[] data) returns (string) {
bytes memory r = new bytes(1);
r[0] = bytes1(data[0]);
return string(r);
}
Dank Piper und Chris habe ich eine funktionierende Lösung für Solidity <= 0.2.1 gefunden. Der Grund, warum die ersten beiden Protokollanweisungen unterschiedliche Ergebnisse zurückgeben, liegt darin, dass uintN rechtsbündig und bytesN linksbündig ist. Die Konvertierung zwischen uintN und bytesN verkürzt zuerst und ändert dann die Ausrichtung. Deshalb muss es vor der Konvertierung in zurückkonvertiert bytes32
werden byte
:
LogBytes1(byte(data)); // prints "s"
LogBytes1(byte(uint(data))); prints "\x00"
LogBytes1(byte(bytes32(uint(data)))); prints "s"
Eine getestete Lösung für meine Frage ist:
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);
}
Sie können das n- te Byte eines beliebigen bytesXX
Typs mit dem folgenden Code abrufen .
bytes32 v = ...;
byte b = byte(bytes32(uint(v) * 2 ** (8 * n)));
Ab der nächsten Version von Solidity können Sie über Indizes darauf zugreifen .
bytes32 v = ...;
byte b = v[n];
bytes32
. Nicht sicher, ob Sie diese Antwort oder die von unten behalten möchten.
Wang