Wie kann ich in Solidität den Bytes-Speicherpuffer in den Bytes8-Typ konvertieren? Beispiel:
bytes8 buf2 = bytes8(memory_buf); // TypeError: Explicit type conversion not allowed
Mit Assembly könnte es so aussehen (aus dieser Antwort kopiert und bearbeitet ):
function convertBytesToBytes8(bytes inBytes) returns (bytes8 outBytes8) {
if (inBytes.length == 0) {
return 0x0;
}
assembly {
outBytes8 := mload(add(inBytes, 32))
}
}
Dies ist ein älterer ineffizienter Vorschlag ohne Verwendung von Assembly, verwenden Sie dies wahrscheinlich nicht:
function convertBytesToBytes8(bytes inBytes) returns (bytes8 outBytes8) {
uint256 maxByteAvailable = inBytes.length < 8 ? inBytes.length : 8;
for (uint256 i = 0; i < maxByteAvailable; i++) {
bytes8 tempBytes8 = inBytes[i];
tempBytes8 = tempBytes8 >> (8 * i);
outBytes8 = outBytes8 | tempBytes8;
}
}
Grundsätzlich iteriert es über jedes der ersten 8 Bytes im inBytes
Array, konvertiert es in eine bytes8
Variable, verschiebt diese Variable dann um einen geeigneten Betrag nach rechts und verknüpft dann die Variable mit dem aktuellen Ergebnis (was es im Grunde anhängt, da der Standardwert für das outBytes8
ist alles Nullen).
Ich habe beide nicht ausgiebig getestet, aber sie scheinen zu funktionieren.
Diese Funktion bytesc8 und versuchen Sie die Solidität:
function getHexString(bytes4 value) pure public returns (string) {
bytes memory result = new bytes(8);
string memory characterString = "0123456789abcdef";
bytes memory characters = bytes(characterString);
for (uint8 i = 0; i < 4; i++) {
result[i * 2] = characters[uint256((value[i] & 0xF0) >> 4)];
result[i * 2 + 1] = characters[uint256(value[i] & 0xF)];
}
return string(result);
}
Versuch es bitte
Danke
Alianse777
willjgriff
Kyrill
outBytes8 := mload(add(inBytes, 8))
Thykof
function convertBytesToBytes4() public returns (bytes4 outBytes8)
und es scheint zu funktionieren, aber ich bin mir nicht sicher.