二进制< ascii>十六进制转换

时间:2012-11-27 00:24:42

标签: c# binary hex ascii converter

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

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

你能解释一下这两行吗?

1 个答案:

答案 0 :(得分:1)

此代码看起来很复杂,因为作者试图将尽可能多的功能打包到一行中。 (如果我心情不好,我会称之为“炫耀”,并且可能会抱怨如果一个大三学生试图检查这个。)但是,这行代码的任何一部分都不复杂;把它分开一块一块地检查一下。

对于初学者来说,第一线就是垃圾; ToInt32("a")会引发FormatException因为您没有指定16的基数,因为:ToInt32("a", 16)。但是,如果您修复它,它将返回10.ToString("x") "a"。所以忽略那一行,它没有任何用处。 (我们可以想象作者想要使用像Encoding.UTF8.GetBytes()这样的东西来返回0x61,但他们没有。{/ p>

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

String.Join(String.Empty, 

这非常简单:它将使用String.Empty作为分隔符(IOW,不分离)。{/ p>

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