¿Cómo puedo convertir un string
a un bytes32
? ¿Alguien tiene una función mágica o una biblioteca que lo haga?
Por ejemplo: Esto funciona ya que como entrada di 32 bits. Pero no funcionará con caracteres "> 32 bits".
set_txn_hash = a.transact().set("QmVoGzRDscx61k3RHHkLYaMFtxYZi3ps");#32-bit char
-
function get() returns (stringc value){
return list.get_head_data();
}
Pero si necesito dar más caracteres, por ejemplo, contiene una cadena de 48 bits, esto no funcionará. [P] ¿Cómo podría hacer que esto funcione?
Esto ha funcionado para mí hasta ahora. No estoy seguro si es la mejor manera.
function stringToBytes32(string memory source) public pure returns (bytes32 result) {
bytes memory tempEmptyStringTest = bytes(source);
if (tempEmptyStringTest.length == 0) {
return 0x0;
}
assembly {
result := mload(add(source, 32))
}
}
Además, recuerde que las cadenas en Solidity son UTF8, por lo que después de convertirlas en bytes, cada byte no es necesariamente un carácter.
EDITAR: versión más corta, debería funcionar igual.
string
no es igual a bytes32
pero es igual a bytes
, porque su longitud es dinámica.
así que te vendría bien un castingbytes B=bytes(S); //S string
P.ej
contract string_test {
function string_tobytes( string s) constant returns (bytes){
bytes memory b3 = bytes(s);
return b3;
}
}
La conversión de string
a bytes32
solo es posible usando ensamblador
bytes memory data = bytes("mined");
ethers.js tiene una función de utilidad incorporada para esto: https://docs.ethers.io/ethers.js/html/api-utils.html#bytes32-strings
const ethers = require('ethers')
const utils = ethers.utils
const inBytes = utils.formatBytes32String("test");
No se necesita ensamblaje en la versión 0.8.7
string text = "whatever";
bytes32 stringInBytes32 = bytes32(bytes(text));
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
contract stringtobytes{
function set(string memory _a)public pure returns(bytes memory){
return (bytes(_a));
}
}
puede convertir cadenas a bytes (en formato decimal) con el siguiente código
1- bytes1=8bit=2decimal
2 bytes 2 = 16 bits = 4 decimales
3 bytes 3 = 24 bits = 6 decimales
4 bytes = matriz dinámica y valor de referencia
function get(string memory key)
public
view
returns (bytes32) {
return bytes32(abi.encodePacked(key));
}
Por favor, haga referencia a esto. Puede convertir una cadena en una matriz de bytes32. La longitud de la cadena puede ser superior a 32.
alper
Grzegorz Kapkowski
bytes32 result :=
mientras mi código declara el tipo de resultado enreturns (bytes32 result)
, simplemente elimine elbytes32
anteriorresult := ...
y debería compilarse.alper
Brusco
Grzegorz Kapkowski
EtherPaul
willjgriff
Tarek