2012-11-27 79 views
1

好吧,所以我有以下代码,我在互联网上查找,但对于我的项目,我不允许使用代码,只是在它的工作。我必须理解它,并能够给出和解释代码以及它在做什么。二进制< ascii >十六进制转换

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'))); 

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

+0

那么究竟是什么**你无法理解这一行? –

+1

也许你应该在调试器中一次写一步。例如,'int i = Convert.ToInt32(“a”);'。然后看看'我'的价值是什么。然后'string s = i.ToString(“x”);'并检查's'的值。这会让你了解这些事情的作用。或者,您可以查看这些方法的文档。 –

+1

@JimMischel我明白,i.toString(“x”);格式化文本,但它如何将“a”转换为十六进制而不指定其基数为16? –

回答

1

此代码看起来很复杂,因为作者试图尽可能多地将一个功能打包到一行中。 (如果我的心情较为平淡,我会称之为“炫耀”,如果大三学生试图检查这个问题,可能会抱怨。)但是,这行代码中没有任何一部分是复杂的;把它分开一点一点地分开,然后检查每一点。

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

第二行,你打破每一位,并看看会发生什么:

String.Join(String.Empty, 

这是很简单:它要采取字符串和join them together数组,使用String.Empty作为分隔符

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,您正在将一串十六进制数字“转换”为二进制数字的“等价”字符串。

+0

好吧,我现在明白它已经被分解成一口大小的块,但是对于我的第一条线没有任何猜测,是否有相当于它?也感谢这个深入的解释。 –

+0

我不确定第一行的内容是从哪开始的;如果你使用'Convert.ToInt32(“a”,16).ToString(“x”);'那么它会“运行”,但它仍然没有任何用处。 (这也忽略了这个事实,即使你没有在任何地方存储结果。) –

+0

哦,它将值存储在字符串数组中我只是没有显示,因为我知道如何将ect附加到字符串。基本上它的意思是将一个字符串转换为十六进制。 –