Solidity

solidity 十六進制錯誤程式碼

  • September 4, 2022

我知道十六進製字元(0 1 2 3 4 5 6 7 8 9 ABCDEF)

當我寫程式碼時

string a= hex"011a" //it is ok 

但是當寫這段程式碼時

string a=hex"011aa" // get Error 

為什麼?我怎樣才能充分利用這一點

首先,您需要成對添加字元,因為一對十六進制數字是一個字節。

顯示錯誤的行具有不均勻的字元集:

string a=hex"011aa" // get Error 

最好這樣做:

string a2 =hex"011a0a";

此外,原因是您需要添加值在 0-127 範圍內(十進制)的字節。因為這些是 Solidity 支持的值可列印 UTF-8 字元。

例如看這張表:https ://www.asciitable.com/

你會看到它從十進制的 0 到 127。在十六進制中,範圍為 0-7F。

如果你試試這個:

string a = hex"aa";

它不會起作用,因為十六進制的十進制值為aa170,我們知道它不應該大於127。所以我們限制在十六進制的0-7F範圍內:

string min_max_accii_value = hex"00_7f";

在這裡進行自己的轉換:https ://www.rapidtables.com/convert/number/hex-to-decimal.html?x=aa

因此,您可以執行以下操作,並將其分開_以使其更具可讀性:

string a3 = hex"00_0a_7f";

這裡的文件:https ://docs.soliditylang.org/en/v0.8.11/types.html#unicode-literals

雖然它真的不清楚您要做什麼,但當您這樣做時 string x = hex'something',編譯器將查找與您輸入的十六進制數相對應的 UTF-8 字元,因此期待偶數個字元(2 個十六進製字元 = 1字節)。至於你的第二個問題,我不太明白,對不起,你可以……用它來輸出不可列印的字元,我猜?(這就是您對第一個字元串所做的事情,01 和 1a 在 UTF-8 中都是不可列印的字元)但是,是的,您為什麼要這樣做?

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