Solidity
字元串穩固性的地址
我正在使用此程式碼將地址轉換為可靠的字元串
function toAsciiString(address x) public 返回(字元串記憶體){
bytes memory s = new bytes(40); for (uint i = 0; i < 20; i++) { bytes1 b = bytes1(uint8(uint(uint160(x)) / (2**(8*(19 - i))))); bytes1 hi = bytes1(uint8(b) / 16); bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi)); s[2*i] = char(hi); s[2*i+1] = char(lo); } return string(abi.encodePacked("0x",s)); }
函式 char(bytes1 b) 公共返回 (bytes1 c) {
if (uint8(b) < 10) return bytes1(uint8(b) + 0x30); else return bytes1(uint8(b) + 0x57); }
輸入:0x4a9C121080f6D9250Fc0143f41B595fD172E31bf
輸出:0x4a9c121080f6d9250fc0143f41b595fd172e31bf
如您所見,存在大小寫問題。輸出應與輸入相同,但輸入中的大寫字母以小寫字母形式輸出。我正在混音中執行此程式碼。請讓我知道是否有任何修復。
上面程式碼的問題是您將地址分開並將其轉換為一次 1 個十六進制數字的字元串。在十六進制中,大寫和小符號之間沒有區別(例如,
0xA
等於0xa
又等於 的十進制值10
)。所有高於十進制值的十六進製字元10
(來自 af 的非十進製字元)都通過將其十六進制值遞增0x57
以產生字母 (az) 轉換為 ASCII 字元。0xa
並且由於像和之類的輸入值0xA
基本上是相同的值,因此兩者都會產生相同的小寫字母a
。校驗和詳細資訊在該轉換中失去,結果字元串全部為小寫。如果要保留校驗和資訊,則需要在地址中包含十六進制數字的索引,因為校驗和算法描述如下:
將地址轉換為十六進制,但如果第 i 個數字是字母(即它是 abcdef 之一),如果小寫十六進制地址的第 4*ith 位為 1 (),則以大寫形式列印,否則以小寫形式列印。
基本上,您首先需要將地址轉換為小寫字元串,然後獲取它的 keccak256 雜湊並應用上述算法。有關校驗和算法的更多資訊在這裡。