- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Punycode编码
一 Punycode 基于的思想
1.1 可变长整数引入的原因
Punycode是基于36进制数的编码格式,由a..z~0..9表示0-35的可变长整数。
而由于普通的可变长整数连接在一起无法区分各个整数的界限
如,734651,无法区分是,7,34651这两个整数,或者是734,651这两个数
于是,punycode在每一位引入阈值,t(j)(从低位到高位)
每一位有对应的权重和权值。
恰好只有一个权值最大的digit_jt(j),从而可以区分各个数。
如,734651….. 对应的阈值为,2,3,5,5,5,5….
因为72,3=3,25,所以,2就是那个权重最大的digit,因此,734是一个数,类推,只,251是一个数。
区分出哪几位是一个数,则方便解码的过程
1.2 可变长整数的定义规范
可变长整数的有三个重要参数,权重,权值,阈值
权值
在punycode中,权值的取值是基于36进制的,所以,权值的取值范围是a..z(或A..Z)0..9,这36个值,分别代表0-35
阈值
阈值的公式是:
t(j) = base * ( j+1 ) – bias
在这里,t(j)有自己的最大值tmax和最小值tmin,当公式计算的值大于tmax时,则取tmax作为阈值,反之,则取tmin为阈值。
base取值是36,bias是贝叶斯调制,计算方法如下:
1.为了避免下步操作数据溢出,堆会按照比例缩小
第一次缩小,delta= delta/damp
第二次及以后,delta= delta/2
2.堆的增加补偿了下个堆会被放入更长的字符串里:
Delta = delta + (delta/numpoints)
3.堆不断减小,直到落入界限值
for (k = 0; delta ((base - tmin) * tmax) / 2; k += base)
{
delta /= base - tmin;
}
4.得到bias 的值
k + (base - tmin + 1) * delta / (delta + skew);
以上过程被封装在下面这个函数中
static punycode_uint adapt (punycode_uint delta, punycode_uint numpoints, int firsttime)
权重
权重的计算公式如下
W(0) = 1
W (j) = w( j-1 ) * (base - t(j-1) ) 当j0时
因而,一个数的值等于其权值乘以对应的权重之和。
二.Punycode 编码过程
2.1 流程图
这里对应的代码是
for (m = maxint, j = 0; j input_len; ++j)
{
/* if (basic(input[j])) continue; */
/* (not needed for Punycode) */
// printf(mmmmmmmmmmmm = %u\n, m);
if (input[j] = n input[j] m) //大于前一个的最小值,且是之后最小的值
{
m = input[j];
//printf(mmmmmmmmmmmm = %u\n, m);
}
}
这里对应的代码是:
delta += (m - n) * (h + 1);
这里对应的代码是
for (q = delta, k = base;; k += base)
{
if (out = max_out)
return punycode_big_output;
t = k = bias /* + tmin */ ? tmin : /* +tmin not needed */
k = bias + tmax ? tmax : k - bias;
if (q t)
break;
output[out++] = encode_digit (t + (q - t) % (base - t), 0);
q = (q - t) / (base - t);
}
output[out++] = encode_digit (q, case_flags case_flags[j]);
bias = adapt (delta, h + 1, h == b);
delta = 0;
文档评论(0)