Uint 到 Bytes32 的轉換——這有什麼意義
這裡非常簡單的程式碼:
pragma solidity ^0.4.13; contract Oracle{ event Print(string _name, bytes32 _value); bytes32 key; function Store(bytes32 _key) returns (bytes32) { key = _key; Print("Key",_key); return _key; } }
現在我試圖將值 1 儲存為鍵。
使用混音,
entered key: 1 printed key: 0x0100000000000000000000000000000000000000000000000000000000000000 entered key: "0x01" printed key: 0x0100000000000000000000000000000000000000000000000000000000000000
現在一個奇怪的:
entered key: "0x1" printed key: 0x0100000000000000000000000000000000000000000000000000000000000000
而且很奇怪:
entered key: "1" printed key: 0x3100000000000000000000000000000000000000000000000000000000000000
而且超級奇怪……當使用 NodeJS 推送原始交易時:
Entered:1 Printed key: 0x1000000000000000000000000000000000000000000000000000000000000000
那麼問題來了,為什麼 “0x1” 和 “0x01” 和 1 在 remix 而不是節點上都給了我相同的答案?為什麼引號中的 1 會有所不同?
根據您的範例:
輸入密鑰:1 列印密鑰:0x0100000000000000000000000000000000000000000000000000000000000000
字節儲存為 256 位值的數組(在您的大小為 32 字節的情況下),因此您將 uint 1 的值儲存在數組的第一個字節中,即 0x01 並且數組的其餘部分為空。
輸入密鑰:“0x01” 列印密鑰:0x01000000000000000000000000000000000000000000000000000000000000000
在solidity中,“0x01”將被轉換為等效的字元串,因為它是256位uint的有效十六進制值
輸入密鑰:“0x1” 列印密鑰:0x0100000000000000000000000000000000000000000000000000000000000000
同上 0x01 和 0x1 一樣,就像 0x001 和 0x000001 一樣,都是 1 的整數值
輸入鍵:“1” 列印鍵:0x3100000000000000000000000000000000000000000000000000000000000000
這是字元串“1”的 ascii 十六進制值,即 0x31
輸入:1 列印密鑰:0x1000000000000000000000000000000000000000000000000000000000000000
我從未嘗試過使用 NodeJS,所以我無法回答這個問題。希望我回答了你的其他問題。