%Q, %q, %W, %w, %x, %r, %s

本文深入探讨了编程中遇到引号嵌套、变量引用等复杂情况时,如何通过特定语法如%Q、%W、%x、%r、%s等进行有效处理,特别关注了字符串转义、数组转化、正则表达式生成以及符号转换的应用场景,同时提供了实例代码以直观展示这些功能的使用方法。
%Q
遇到引号嵌套的时候我们往往需要使用反斜线来实现转义,使用%Q(…)可以实现同样的效果,最终输出字符串,并且支持使用#{}操作变量

%Q(Joe said: "Frank said: "#{what_frank_said}"")
# => "Joe said: "Frank said: "Hello!"""


%q

%q和%Q大同小异,只是用于单引号,因此无法支持变量


%q(Joe said: 'Frank said: '#{what_frank_said} ' ')
#=> "Joe said: 'Frank said: '\#{what_frank_said} ' '"


%W

转化为数组并支持变量


%W(#{foo} Bar Bar\ with\ space)
#=> ["Foo", "Bar", "Bar with space"]


%w

转化为数组,但不支持变量


%w(#{foo} Bar Bar\ with\ space)
#=> ["\#{foo}", "Bar", "Bar with space"]


%x

相当于可执行符号 ``


%x(echo foo:#{foo})
#=> "foo:Foo\n"


%r

转化为正则表达式


%r(/home/#{foo})
#=> "/\\/home\\/Foo/"



%s

转化为symbols


%s(foo)
#=> :foo
%s(foo bar)
#=> :"foo bar"
%s(#{foo} bar)
#=> :"\#{foo} bar"
NTL(Number Theory Library)是一个用于数论计算的C++库,不过在Python中可以通过`gmpy2`库来实现类似的数论计算功能,下面是一个基于`gmpy2`库实现DSA(Digital Signature Algorithm)算法的Python代码示例: ```python import gmpy2 import random # 生成DSA参数 def generate_dsa_params(): # 选择一个160位的素数q q = gmpy2.next_prime(random.getrandbits(160)) # 选择一个1024位的素数p,使得p - 1是q的倍数 p = None while True: x = random.getrandbits(1024 - 160) p_candidate = x * q + 1 if gmpy2.is_prime(p_candidate): p = p_candidate break # 找到一个阶为q的元素g h = 2 while True: g = gmpy2.powmod(h, (p - 1) // q, p) if g > 1: break h += 1 return p, q, g # 生成密钥对 def generate_key_pair(p, q, g): # 选择一个随机整数x,1 < x < q x = random.randint(2, int(q) - 1) # 计算y = g^x mod p y = gmpy2.powmod(g, x, p) return x, y # 签名消息 def sign_message(p, q, g, x, message): k = random.randint(2, int(q) - 1) r = gmpy2.powmod(g, k, p) % q if r == 0: return sign_message(p, q, g, x, message) z = int.from_bytes(message.encode(), byteorder='big') s = (gmpy2.invert(k, q) * (z + x * r)) % q if s == 0: return sign_message(p, q, g, x, message) return r, s # 验证签名 def verify_signature(p, q, g, y, r, s, message): if r < 1 or r > q - 1 or s < 1 or s > q - 1: return False z = int.from_bytes(message.encode(), byteorder='big') w = gmpy2.invert(s, q) u1 = (z * w) % q u2 = (r * w) % q v = ((gmpy2.powmod(g, u1, p) * gmpy2.powmod(y, u2, p)) % p) % q return v == r # 示例使用 p, q, g = generate_dsa_params() x, y = generate_key_pair(p, q, g) message = "Hello, DSA!" r, s = sign_message(p, q, g, x, message) is_valid = verify_signature(p, q, g, y, r, s, message) print(f"Signature is valid: {is_valid}") ``` ###
最新发布
11-26
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值