我正在处理具有 8DnKOc6FISU、rNsrl86inpo、5qcmCUsw4EQ 等 ID 的 Youtube 视频(即 A-Za-z0-9_- 中的 11 个字符)
目标是将每个 id 转换为一种颜色(由 0-1 范围表示),以便可以可靠地绘制它们。
根据 this question这些是 64 位数字。鉴于:
- 我想充分利用任何给定视频集的色彩空间
- 无论如何,颜色感知都不是那么准确
...基于 ID 的最后 2-3 个字符似乎是明智的。
我的主要方法是从 here 中借用的一个函数,它将每个字符转换为二进制数,如下所示:
function toBin(str){
var st,i,j,d;
var arr = [];
var len = str.length;
for (i = 1; i<=len; i++){
d = str.charCodeAt(len-i);
for (j = 0; j < 8; j++) {
st = d%2 == '0' ? "class='zero'" : ""
arr.push(d%2);
d = Math.floor(d/2);
}
}
}
但这留下了如何将其转换回 float 的问题。
有什么优雅的解决方案吗?
非常感谢您的帮助!
最佳答案
知道系统是 base 64 (26+26+10+2),只需读取每个符号,将其添加到总数中,并在每次迭代中将结果乘以 64。最后你会得到一个整数。将其除以最大值以将其归一化到 0-1 范围。
当您的 ID 接近 253 时,您将开始失去精度,因为这是 JS 可以精确表示的整数的最大值。
或者,您可以通过为行中的每个位置添加 (letter_index/64letter_position) 从一开始就计算 float ,但您会在过程中失去更多的精度。
关于javascript - 在 Javascript 中将任意字符串转换为 0 到 1 之间的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11222978/