Ethereumj

如何在 Java 中將 Java 字元串轉換為 Bytes32?我正在使用 web3j solidity 包裝器與智能合約進行互動。我收到以下錯誤:

  • November 23, 2019

java.lang.UnsupportedOperationException:輸入字節數組必須在範圍 0 < M <= 32 並且長度必須匹配類型

我正在嘗試按照下面給出的方式進行操作。我想添加人員,但在 web3j 中生成的包裝器拋出了上面的錯誤:

String s = "Rahul"; 
//System.out.println(s.getBytes().length);
Bytes32 b1=new Bytes32(s.getBytes());
contract.addPerson(b1,new Uint256(new BigInteger("35"));

最好盡可能使用 JVM 執行時庫;儘管確實存在例外,但該程式碼通常質量很高。在下面的程式碼中,我首先創建一個byte[],然後通過呼叫DatatypeConverter.printHexBinary派生一個十六進制值。

byte[] byteArray = "This string is converted to a byte array".getBytes();
String hexValue = javax.xml.bind.DatatypeConverter.printHexBinary(byteArray);

不確定您是否仍然需要解決方案,但因為它仍然沒有答案,對於其他可能需要的人來說。

str.getBytes()僅返回該字元串的字節,但實際過程很長。

主要問題是Bytes32(byte[])只支持 32 長度byte[]。還要記住Numeric.hexStringToByteArray(strValueInHex)將 String 的任何十六進制值轉換為byte[].

這是過程

注意:"00"= 1 個長度的十六進制和 2 個長度的字元串

String =&gt; Hex =&gt; 32 length Hex (ie. 64 length HexString) =&gt; byte[] =&gt; Bytes32

這是我如何實現字元串到字節:

字元串到 64 長度的 HexString:

// String to 64 length HexString (equivalent to 32 Hex lenght)
public static String asciiToHex(String asciiValue)
{
   char[] chars = asciiValue.toCharArray();
   StringBuffer hex = new StringBuffer();
   for (int i = 0; i &lt; chars.length; i++)
   {
       hex.append(Integer.toHexString((int) chars[i]));
   }

   return hex.toString() + "".join("", Collections.nCopies(32 - (hex.length()/2), "00"));
}

64 長度的 HexString 到 32 長度的字節

$$ $$:

byte[] myStringInByte = Numeric.hexStringToByteArray(asciiToHex("myString"));

32個長度字節

$$ $$到 Bytes32:

Bytes32 myStringInBytes32 = new Bytes32(myStringInByte);

引用自:https://ethereum.stackexchange.com/questions/11898