Konvertieren Sie 'bytes memory' in 'bytes8'

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

Antworten (2)

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 inBytesArray, konvertiert es in eine bytes8Variable, 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 outBytes8ist alles Nullen).

Ich habe beide nicht ausgiebig getestet, aber sie scheinen zu funktionieren.

Ich glaube nicht, dass es mit dem Zusammenbau viel schneller geht. Übrigens hat es mein Problem gelöst.
Überprüfen Sie die obige Bearbeitung mit der Assembly-Version, ich bin mir sicher, dass sie effizienter ist.
Das ursprüngliche Beispiel wurde in bytes32 konvertiert. In diesem Fall für ein Byte8, denke ich, sollten Sie damit rechnenoutBytes8 := mload(add(inBytes, 8))
Für die Konvertierung in bytes4 habe ich nur die Funktionssignatur in geändert function convertBytesToBytes4() public returns (bytes4 outBytes8)und es scheint zu funktionieren, aber ich bin mir nicht sicher.

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