1

好的,所以我在互联网上查找了以下代码,但是对于我的项目,我不允许使用代码,如果它有效就将其扔进去。我必须理解它,并且能够对代码及其作用给出和解释。

Convert.ToInt32("a").ToString("x");//ascii to hex
String.Join(String.Empty, 
      stringInput.Select(
         c => Convert.ToString(
            Convert.ToUInt32(c.ToString(), 16), 2).PadLeft(4, '0'))); 

你能给我解释一下这两行吗?

4

1 回答 1

1

这段代码看起来很复杂,因为作者试图将尽可能多的功能打包到一行中。(如果我心情更糟,我会称其为“炫耀”,如果有小辈试图检查这一点,我可能会抱怨。)但是,这行代码的任何一个部分都不是复杂的。只需将它一块一块地拆开并检查每一位。

对于初学者来说,第一行就是垃圾。ToInt32("a")抛出 aFormatException因为您没有指定 16 的基数,如:ToInt32("a", 16). 但是,如果您修复它,它将返回10.ToString("x")which is "a". 所以忽略那条线,它没有任何用处。(我们可以想象作者打算使用类似Encoding.UTF8.GetBytes()return的东西0x61,但他们没有。)

第二行,你分解每一位,看看它做了什么:

String.Join(String.Empty, 

这很简单:它将获取一个字符串数组并将它们连接在一起String.Empty用作分隔符(IOW,无分隔。)

  stringInput.Select(

这是我们使用 LINQ 来构建一个IEnumerable字符串;它将遍历字符串中的字符,一次一个,并在每个字符上执行 lambda 表达式。

     c => Convert.ToString(
        Convert.ToUInt32(c.ToString(), 16), 2).PadLeft(4, '0'))); 

这就是它变得混乱的地方,因为即使对我来说,用眼睛匹配这些括号也是一种痛苦,但如果你将嵌套函数调用扩展为临时函数,你会得到:

s = c.ToString();              // Convert the character to a string
u = Convert.ToUInt32(s, 16);   // Convert a string of hex digits to a uint
b = Convert.ToString(u, 2);    // Convert a uint to a string of binary digits.
return b.PadLeft(4, '0')));    // Add 0s to make the string at least 4 digits.

这些“返回”值中的每一个都成为可枚举中的下一个元素,由 返回Select,然后将其连接起来。

这里的最终结果是你从一串从 0 到 F 的十六进制数字开始,当作为数字读取时,它具有一些特定的数值,你最终得到一串二进制数字 0 和 1,当读取为一个数字,具有相同的数值。IOW,您正在将一串十六进制数字“转换”为二进制数字的“等价”字符串。

于 2012-11-27T01:03:27.387 回答