string
Wie kann ich a in a umwandeln bytes32
? Hat jemand eine magische Funktion oder Bibliothek, die es tut?
Zum Beispiel: Dies funktioniert, da ich als Eingabe 32-Bit angegeben habe. Aber es funktioniert nicht mit "> 32-Bit" Zeichen.
set_txn_hash = a.transact().set("QmVoGzRDscx61k3RHHkLYaMFtxYZi3ps");#32-bit char
-
function get() returns (stringc value){
return list.get_head_data();
}
Aber wenn ich mehr Zeichen angeben muss, zum Beispiel eine 48-Bit-Zeichenfolge enthält, funktioniert dies nicht. [F] Wie könnte ich das zum Laufen bringen?
Das hat bei mir bisher funktioniert. Nicht sicher, ob es der beste Weg ist.
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))
}
}
Denken Sie auch daran, dass Zeichenfolgen in Solidity UTF8 sind, sodass nach der Konvertierung in Bytes nicht jedes Byte unbedingt ein Zeichen ist.
EDIT: kürzere Version, sollte gleich funktionieren.
string
ist nicht gleich bytes32
aber gleich bytes
, weil seine Länge dynamisch ist.
Sie könnten also ein Casting gebrauchenbytes B=bytes(S); //S string
Z.B
contract string_test {
function string_tobytes( string s) constant returns (bytes){
bytes memory b3 = bytes(s);
return b3;
}
}
Die Konvertierung von string
nach bytes32
ist nur über Assembler möglich
bytes memory data = bytes("mined");
ethers.js hat dafür eine eingebaute Hilfsfunktion: 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");
Die Assemblierung ist in Version 0.8.7 nicht erforderlich
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));
}
}
Sie können Zeichenfolgen mit dem folgenden Code in Bytes (im Dezimalformat) konvertieren
1-Bytes1=8bit=2dezimal
2 Bytes2=16bit=4dezimal
3 Bytes3=24bit=6dezimal
4 Bytes=dynamisches Array und Referenzwert
function get(string memory key)
public
view
returns (bytes32) {
return bytes32(abi.encodePacked(key));
}
Bitte verweisen Sie darauf. Sie können eine Zeichenfolge in ein bytes32-Array konvertieren. Die Länge der Zeichenfolge kann länger als 32 sein.
Alper
Grzegorz Kapkowski
bytes32 result :=
während mein Code das Ergebnis deklariert, Typ inreturns (bytes32 result)
, entfernen Sie einfach dasbytes32
von vorherresult := ...
und es sollte kompilieren.Alper
Kurz
Grzegorz Kapkowski
EtherPaul
willjgriff
Tarek