Ich bin neu in der Entwicklung von Smart Contracts mit web3j. Ich habe ein Problem beim Konvertieren von Bytes32 [], das von der Methode Wrapper of Contract (.sol) in ein Array zurückgegeben wird.
Ich habe einen Vertrag als:
pragma solidity ^0.4.4;
contract Person
{
Person[] public people;
struct Person
{
bytes32 firstName;
bytes32 lastName;
}
function addPerson(bytes32 _firstName, bytes32 _lastname) returns (bool success)
{
Person memory newPerson;
newPerson.firstName = _firstName;
newPerson.lastName = _lastname;
people.push(newPerson);
return true;
}
function getPeople() constant returns (bytes32[], bytes32[])
{
uint leng = people.length;
bytes32[] memory first_names = new bytes32[](leng);
bytes32[] memory last_names = new bytes32[](leng);
for (uint i = 0; i < people.length; i++ )
{
Person memory currentPerson;
currentPerson = people[i];
first_names[i] = (currentPerson.firstName);
last_names[i] = (currentPerson.lastName);
}
return (first_names,last_names);
}
}
Function from generated java wrapper as:
public RemoteCall<Tuple2<List<byte[]>, List<byte[]>>> getPeople() {
final Function function = new Function("getPeople",
Arrays.<Type>asList(),
Arrays.<TypeReference<?>>asList(new TypeReference<DynamicArray<Bytes32>>() {}, new TypeReference<DynamicArray<Bytes32>>() {}));
return new RemoteCall<Tuple2<List<byte[]>, List<byte[]>>>(
new Callable<Tuple2<List<byte[]>, List<byte[]>>>() {
@Override
public Tuple2<List<byte[]>, List<byte[]>> call() throws Exception {
List<Type> results = executeCallMultipleValueReturn(function);;
return new Tuple2<List<byte[]>, List<byte[]>>(
(List<byte[]>) results.get(0).getValue(),
(List<byte[]>) results.get(1).getValue());
}
});
}
In meiner Hauptfunktion versuche ich, auf Bytes of Array zuzugreifen, die von der getPeople-Methode zurückgegeben werden. Aber ich bin nicht in der Lage, Bytes von Array in String zu konvertieren. Ich speichere Tupelwerte in der Hauptmethode als:
Tuple2<List<byte[]>, List<byte[]>> x = contract.getPeople().send();
Ich möchte den Wert in eine Zeichenfolge konvertieren x.getValue1()
. Kann mir bitte jemand sagen wie man das macht.
Übergeben Sie Ihr Hex oder Byte in dieser Methode, um die Zeichenfolge zurückzugeben.
var hexToUtf8 = function(hex) { if (!isHexStrict(hex)) throw new Error('The parameter "'+ hex +'" must be a valid HEX string.');
var str = "";
var code = 0;
hex = hex.replace(/^0x/i,'');
// remove 00 padding from either side
hex = hex.replace(/^(?:00)*/,'');
hex = hex.split("").reverse().join("");
hex = hex.replace(/^(?:00)*/,'');
hex = hex.split("").reverse().join("");
var l = hex.length;
for (var i=0; i < l; i+=2) {
code = parseInt(hex.substr(i, 2), 16);
// if (code !== 0) {
str += String.fromCharCode(code);
// }
}
return utf8.decode(str);
};