[英]How does this work in C++ and any rough equiavalnce of this in JavaScript?
我目前正在研究用C ++编写的加密/解密程序。 我不理解的代码片段。 我一直试图将整个源转换为JavaScript。
我有两个问题:
uint32_t char_to_int(char c){
if(c >='0' && c<='9')
return c -'0';
else
return c - 'a' + 10;
}
1)该代码如何工作?
uint32_t char_to_int(char c){ if(c >='0' && c<='9') return c -'0'; else return c - 'a' + 10; }
只是从十六进制数字“ 0” ..“ 9”或“ a” ..“ f”返回整数值0 .. 15
如果c是字符'3',则第一个测试为true,因此返回'3'-'0'= 3
如果c是字符'b',则测试为假,并且代码返回'b'-'a'+ 10 = 11
2)这在JavaScript中有什么大致的等效之处吗?
在javascript中,只需使用parseInt(hexString, 16);
如果我完成给定的代码就可以使用它:
#include <iostream>
typedef unsigned uint32_t;
uint32_t char_to_int(char c) { if(c >='0' && c<='9') return c -'0'; else return c - 'a' + 10; }
int main()
{
for (char c = '0'; c <= '9'; ++c)
std::cout << c << " -> " << char_to_int(c) << std::endl;
for (char c = 'a'; c <= 'f'; ++c)
std::cout << c << " -> " << char_to_int(c) << std::endl;
return 0;
}
执行是:
0 -> 0
1 -> 1
2 -> 2
3 -> 3
4 -> 4
5 -> 5
6 -> 6
7 -> 7
8 -> 8
9 -> 9
a -> 10
b -> 11
c -> 12
d -> 13
e -> 14
f -> 15
在C ++中, char
是像int
这样的整数类型。 字符文字(例如'a'
或'0'
)也是整数类型,而不是像JavaScript中的字符串。
在JavaScript中,通过对单字符字符串s
使用s.charCodeAt(0)
,您将获得这样的整数值(字符代码)。 对于更长的字符串,它将返回第一个字符的字符代码。
在这里可以找到主要使用编码的基本字符集的代码表。
只需将缺少的.charCodeAt(0)
到变量和字符串文字中,即可将C ++代码直接转换为JavaScript非常简单。
还记住, '1' - '0'
在C ++是不一样的'1' - '0'
在JavaScript中,虽然结果是相同的。 前者从字符代码'1'
减去字符代码'0'
'1'
。 后者将'1'
转换为1, '0'
为0,并计算差值。 这就是为什么您收到带有c - 'a'
NaN
c - 'a'
NaN
的原因,其中'a'
(可能是c
)不能转换为数字。
uint32_t char_to_int(char c){ if(c >='0' && c<='9') return c -'0'; else return c - 'a' + 10; }
此函数将数字( '0'
转换为'9'
)转换为等效的数字,即'0'
转换为0
, '1'
转换为1
,...。 '9'
转换为9
。
c - 'a' + 10
,将小写字母转换为数值等效项,即'a'
变为10
, 'b'
变为11
,..... 'z'
变为35
。 但是,仅当实现(即编译器)使用带有连续小写字母集(例如ASCII)的字符集时,此方法才有效。 但是,现实世界中的字符集没有连续的小写字母集。
问题在于,除了数字以外,所有字符也都进行了转换,因此结果可能毫无意义。 例如,它将无法正确处理大写字母(如果希望将大写字母转换为与小写字母相同的字母)。
该功能一次只操作一个字符。 它尝试与标准函数strtoul()
做相同的事情,除了strtoul()
(1)对字符串(不是单个字符)起作用,(2)对大写和小写字母都正确起作用,(3 )不管实现支持什么字符集,它都能正常工作,并且(4)进行错误检查(例如,如果检测到无效字符,则返回零)。 strtoul()
不仅限于十六进制转换,它的工作基数为35
。
至于JavaScript中的等效代码-基本上相同的代码可能会起作用,但存在与C / C ++版本类似的缺陷。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.