# Cairo 之旅 III:通过 Starkling 学习 Felt 和 String **Published by:** [Starknet 中文](https://paragraph.com/@starknet-zh/) **Published on:** 2022-10-26 **URL:** https://paragraph.com/@starknet-zh/cairo-iii-starkling-felt-string ## Content 作者:Darington Nnam 原文:Journey through Cairo III — A deep dive into Strings and Felts with Starkling 翻译:Louis Wang 校对:「StarkNet 中文社区」 欢迎来到我们 「Cairo 之旅」系列的第三课!在上篇文章中,我们完成了 Starklings 语法部分的挑战,了解 Cairo 基本内容,包括命名空间 (Namespace)、结构体 (Struct) 等。今天我们将深入研究字符串 (Strings) 和整数 Felts。 像往常一样,如果你是中途加入的,建议从头开始看我们的文章。 Felts 不像 Solidity 有相当多的各种数据类型,如 uints、strings、bools 等,Cairo 只有一个数据类型:felts。 Felts 代表字段元素。简单来说,它们是无符号的整数,最高精度 76 位小数。 虽然使用 felts 有很多优点,但我觉得它们也有一些恼人的缺点。比如说: 1. 它们是一个 252 位的整数,当我们想把一个 uint256 的值放入其中时,就会出现问题。我们可以把 felts 组合成 tuples 来解决这个问题。 2. 据 Cairo 的官方文档,在 Cairo 中,基本的数据类型是一个范围为 0≤x

MAX_LEN_FELT: raise Exception("Text length too long to convert to felt.") return int.from_bytes(text.encode(), "big") def felt_to_str(felt): length = (felt.bit_length() + 7) // 8 return felt.to_bytes(length, byteorder="big").decode("utf-8") def str_to_felt_array(text): return [str_to_felt(text[i:i+MAX_LEN_FELT]) for i in range(0, len(text), MAX_LEN_FELT)] def uint256_to_int(uint256): return uint256[0] + uint256[1]*2**128 def uint256(val): return (val & 2128-1, (val & (2256-2**128)) >> 128) def hex_to_felt(val): return int(val, 16) 打开终端运行以下命令: python3 -i utils.py 终端应该这样显示: 接着我们尝试将 felt 转换成短字符串: 下一步将十六进制数转换成字符串,不过需要先将十六进制转换成 felt,再转换成短字符串: 很好!这证明了短字符串只是编码的 ASCII,因此可以用等价的整数和十六进制数进行互换。 2. strings01.cairo 你知道短字符串可以进行数学运算吗?它们只是被编码的 ASCII 码,因此你可以用它们做任何你可以用整数做的事情,非常神奇! 现在让我们对短字符串做一些数学运算,传递给 decode_cipher1 函数。 如果这看起来很奇怪,我希望你能忘记这些是短字符串,把它们当作数字就好,而且它也遵循四则运算: plaintext = ciphertext + key key = plaintext - ciphertext 已知 plaintext =‘Twinkle Twinkle Little Star’,那么: key = 'Twinkle Twinkle Little Star' - ciphertext 类似的在 decode_cipher2 函数中,我们需要求解 ciphertext: 已知 plaintext = ‘Magic Starknet Money’,根据四则运算求解: plaintext = 1337 * ciphertext + 0xc0de ciphertext = (plaintext - 0xc0de) / 1337 OK!通过测试! 最后 恭喜你在成为 Cairo 专家的道路上取得了重大进展!你可以继续尝试 Starklings 教程的其他部分,期待我们的下一节课。 下篇文章,我们将学习数据存储。如果觉得本教程对你有帮助,转发分享给其他人吧~ ## Publication Information - [Starknet 中文](https://paragraph.com/@starknet-zh/): Publication homepage - [All Posts](https://paragraph.com/@starknet-zh/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@starknet-zh): Subscribe to updates - [Twitter](https://twitter.com/StarkNet_ZH): Follow on Twitter