Zum Beispiel muss ich meine bytes32-Variable in Stücke schneiden und das Ergebnis in 5 Variablen einfügen, die Reihenfolge speichern, bytes2
, bytes2
, bytes2
, bytes2
, bytes8
, bytes1
(auch bekannt als byte
), die Reihenfolge sollte gespeichert werden, und ich kümmere mich nicht wirklich um den Rest der Bytes .
Hat Solidity einige Werkzeuge dafür? Oder es ist nur mit Bitoperationen möglich.
Ich fand einige Schwierigkeiten bei der Arbeit mit diesen Low-Level-Typen.
UPDATE: Also habe ich diese Funktion vorbereitet, die numBytes
Bytes source
ab start
Byte analysiert.
function bytesChunck(bytes32 source, uint start, uint numBytes) constant returns(uint _result){
uint counter = 0;
uint result;
for(uint i = 0; i < numBytes; i++) {
result += uint8(source[start + i]);
}
return result;
//
}
dann konvertiere ich das Ergebnis einfach in benötigte Bytes, wie bytes8(result)
. Aber es scheint übergelaufen zu sein, denn wenn ich 8 Bytes habe, sind die ersten Bytes immer Nullen. Irgendwelche Ideen? :)
Vielen Dank.
Deine Frage ist nicht klar genug. Wenn Sie 32 Bytes in 5 Variablen aufteilen möchten, die eine Gesamtlänge von 2+2+2+2+8+1 = 17
haben, sollten Sie angeben, welche Bytes aufgeteilt werden sollen (Bytes von links oder Bytes von rechts).
Ich habe ein Beispiel geschrieben, das Ihr Problem löst, soweit ich es verstehen konnte. Kommentieren Sie die Antwort - erklären Sie, was Sie genau brauchen, und ich werde den Code ändern.
pragma solidity ^0.4.0;
contract BytesChunkTest
{
bytes32 constant public test_source=0x000000000000000000ff11223344556677889900aabbccddeeff;
bytes32 constant mask1 = 0xff00000000000000000000000000000000000000000000000000000000000000;
bytes32 constant mask2 = 0xffff000000000000000000000000000000000000000000000000000000000000;
bytes32 constant mask8 = 0xffffffffffffffff000000000000000000000000000000000000000000000000;
uint constant main_shift=15;
function sourceToChunk(bytes32 source) constant
returns
(
bytes2 r1_2,
bytes2 r2_2,
bytes2 r3_2,
bytes2 r4_2,
bytes8 r5_8,
bytes1 r6_1
)
{
r1_2 = bytes2(source<<(main_shift*8)&mask2);
r2_2 = bytes2((source<<(main_shift+2)*8)&mask2);
r3_2 = bytes2((source<<(main_shift+4)*8)&mask2);
r4_2 = bytes2((source<<(main_shift+6)*8)&mask2);
r5_8 = bytes8((source<<(main_shift+8)*8)&mask8);
r6_1 = bytes1((source<<(main_shift+16)*8)&mask1);
}
function test() constant
returns
(
bytes2,
bytes2,
bytes2,
bytes2,
bytes8,
bytes1
)
{
return sourceToChunk(test_source);
}
}
Rob Hitchens
janik