¿Cómo devolver una cadena de más de 32 caracteres de la matriz bytes32 []?

Tengo una matriz bytes32[]. Convierto cadenas a bytes32 antes de que se agreguen a la matriz de la siguiente manera:

function stringToBytes32(string memory source) returns (bytes32 result) {
    assembly {
    result := mload(add(source, 32))
    }
}

que convertirá la cadena en un hexadecimal como 0x5468697320697320612074657374206d65737361676520746861742077696c6c, por ejemplo.

Sin embargo, si la cadena convertida en bytes32 tiene más de 32 caracteres, no sé cómo volver a convertirla en su cadena original de más de 32 caracteres. Usar web3.toAsciisolo trae de vuelta los primeros 32 caracteres.

Este tipo de cosas podría ser incómodo y costoso de manejar en un contrato inteligente y conducirá a una complejidad no deseada en el contrato. Me inclinaría por el diseño mínimo de contrato inteligente. Haga que los clientes codifiquen o decodifiquen los datos en fragmentos de 32 bytes.
Digamos que si tuviera mensajes de 128 caracteres de longitud que necesitaran ser almacenados y llamados desde un contrato, ¿sería una solución horrible tener matrices de cuatro bytes32[]? Si no puedo usar una matriz de cadenas.
Si entiendo bien, serían cuatro bytes32, sin la matriz ni bytes32[4]. Sería apropiado en mi humilde opinión.
No, estaba pensando en tener varias matrices bytes32[] (probablemente una mala idea). Necesito alguna forma de almacenar muchos mensajes que tengan más de 32 caracteres, así que pensé que necesitaría usar matrices.
Para la interfaz, trabaje con un mensaje a la vez. Para el almacenamiento, las matrices probablemente serían parte de esto. Echa un vistazo aquí ethereum.stackexchange.com/questions/13167/… .

Respuestas (1)

struct DocumentStruct{bytes32 string1; bytes32 string2; bytes32 string3;}
mapping(bytes32 => DocumentStruct) public documentStructs;

function StoreDocument(bytes32 key,bytes32 string1,bytes32 string2,bytes32 string3) onlyOwner returns (bool success) {
    documentStructs[key].string1 = value;
    documentStructs[key].string2 = name;
    documentStructs[key].string3 = name;
    return true;
}

function RetrieveData(bytes32 key) public constant returns(string,string,string) {
    var d = bytes32ToString(documentStructs[key].string1);
    var e = bytes32ToString(documentStructs[key].string2);
    var f = bytes32ToString(documentStructs[key].string3);
    return (d,e,f);
}
function bytes32ToString(bytes32 x) constant returns (string) {
bytes memory bytesString = new bytes(32);
uint charCount = 0;
for (uint j = 0; j < 32; j++) {
    byte char = byte(bytes32(uint(x) * 2 ** (8 * j)));
    if (char != 0) {
        bytesString[charCount] = char;
        charCount++;
    }
}
bytes memory bytesStringTrimmed = new bytes(charCount);
for (j = 0; j < charCount; j++) {
    bytesStringTrimmed[j] = bytesString[j];
}
return string(bytesStringTrimmed);
}

Esto funciona bastante bien para mí. Estoy de acuerdo en que es un poco complejo codificar y decodificar, pero simplemente ejecute su matriz de 32 bytes para recuperar una cadena

Editar - Aquí hay algunas cosas añadidas. Una forma un poco hacky, pero podría funcionar para usted. Sin embargo, estoy seguro de que Rob gritará ante esta respuesta.

El problema es que solo devolverá 32 caracteres.