繁体   English   中英

这在C ++中是如何工作的,在JavaScript中是如何等效的?

[英]How does this work in C++ and any rough equiavalnce of this in JavaScript?

我目前正在研究用C ++编写的加密/解密程序。 我不理解的代码片段。 我一直试图将整个源转换为JavaScript。

我有两个问题:

  1. 此代码如何工作? 我是C ++编程的新手。
  2. 在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM