首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >字节-引号还是不?

字节-引号还是不?
EN

Ethereum用户
提问于 2017-01-12 16:16:38
回答 2查看 1.1K关注 0票数 5

我有一个以参数bytes32为参数的函数,以及一个使用bytes32作为键的映射。

在geth中,我似乎可以调用contract.foo("0x123abc")contract.foo(0x123abc),但我不确定它们是否给出了相同的结果。

contract.mymap("0x123abc")contract.mymap(0x123abc)也一样,他们是一样的吗?它们总是作为0x123abc0000000000000000000000000000000000000000000000000000000000处理吗?字节类似于字符串,但我不确定它们之间的区别。

我不能在我的合同上测试我想要的任何东西,但是我检查了一下,map(0x1234567890abcdef123)map("0x1234567890abcdef123")都在工作,但是结果不一样。我应该用哪一种?

EN

回答 2

Ethereum用户

回答已采纳

发布于 2017-01-12 20:22:46

总是用引号。JavaScript的最大整数精度为64位。这意味着,如果您的数字超过8个字节,并且您输入它没有引号,您将立即失去精度。

例如:

代码语言:javascript
运行
复制
0x1122334455667700 - 1
> 0x1122334455667700

0x1122334455667700 - 0x1122334455667701
> 0

正确的方法:

代码语言:javascript
运行
复制
web3.toBigNumber("0x1122334455667700").minus(1).toString(16)
>'11223344556676ff'

bytesbytes32实际上是非常不同的。bytesstring相同,而bytes32uint256相同。

如果您的函数需要一个字节,web3将将您的字符串解释为ASCII,即"12345“将被解释为"\x30\x31\x32\x33\x34”。如果它需要一个数字类型(即bytes32),它将将字符串解释为一个BigNumber。如果要确定并减少歧义,可以使用BigNumbers手动将数字转换为web3.toBigNumber()

例如,如果您对'0x123abc'有问题,请尝试

代码语言:javascript
运行
复制
web3.toBigNumber('0x123abc') 

相反,

票数 6
EN

Ethereum用户

发布于 2017-01-12 19:07:42

来自ABI

  • bytes的右填充为零(长度为32)。带引号的"0x123abc“是bytes
  • bytes32uintint这样的类型是用零填充的(长度为32)。没有引号的0x123abc是一个数字(基数为16)。

由于合同采用bytes32,所以使用0x123abc而不带引号或其十进制等效值1194684,以减少与十六进制的混淆。(为了安全起见,请为'1194684‘使用引号,以便将其解释为BigNumber。)

编辑: Per @Tjaden使用'0x123abc',使用web3.toBigNumber('0x123abc')。

票数 3
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/11347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档