C# 二进制<;ascii>;十六进制转换

C# 二进制<;ascii>;十六进制转换,c#,binary,hex,ascii,converter,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.ToS

好的,我有下面的代码,我在网上查到了,但是对于我的项目,我不允许使用代码,如果它有效的话,我就把它扔进去。我必须理解它,并能够给出和解释的代码和它在做什么

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

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

这段代码看起来很复杂,因为作者试图将尽可能多的功能打包到一行中。(如果我心情不好的话,我会称之为“炫耀”,如果一个年轻人试图检查这一点,我可能会抱怨。)然而,这一行代码没有一个部分是复杂的;把它一块一块地拆开,检查每一点

首先,第一行只是垃圾
ToInt32(“a”)
抛出一个
FormatException
,因为您没有将基数16指定为:
ToInt32(“a”,16)
。但是,如果您修复了它,它将返回
10.ToString(“x”)
,即
“a”
。所以忽略这一行,它没有任何用处。(我们可以想象作者打算使用类似
Encoding.UTF8.GetBytes()
的东西返回
0x61
,但他们没有这样做。)

第二行,分解每一位,看看它的作用:

String.Join(String.Empty, 
这很简单:它将使用一个字符串数组,并使用
String.Empty
作为分隔符(low,不分隔)

下面是我们使用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的字符串,当读取为数字时,具有相同的数值。注意,您正在将一个十六进制数字字符串“转换”为一个二进制数字的“等效”字符串。

此代码看起来很复杂,因为作者试图将尽可能多的功能打包到一行中。(如果我心情不好的话,我会称之为“炫耀”,如果一个年轻人试图检查这一点,我可能会抱怨。)然而,这一行代码没有一个部分是复杂的;把它一块一块地拆开,检查每一点

首先,第一行只是垃圾
ToInt32(“a”)
抛出一个
FormatException
,因为您没有将基数16指定为:
ToInt32(“a”,16)
。但是,如果您修复了它,它将返回
10.ToString(“x”)
,即
“a”
。所以忽略这一行,它没有任何用处。(我们可以想象作者打算使用类似
Encoding.UTF8.GetBytes()
的东西返回
0x61
,但他们没有这样做。)

第二行,分解每一位,看看它的作用:

String.Join(String.Empty, 
这很简单:它将使用一个字符串数组,并使用
String.Empty
作为分隔符(low,不分隔)

下面是我们使用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的字符串,当读取为数字时,具有相同的数值。注意,您正在将一个十六进制数字字符串“转换”为一个二进制数字的“等效”字符串。

那么,您在这一行中到底理解了什么?也许您应该一步一步地编写它,并在调试器中执行一步。例如,
inti=Convert.ToInt32(“a”)。然后查看
i
的值。然后
string s=i.ToString(“x”)
并检查
s
的值。这会让你了解这些事情的作用。或者,您可以在文档中查找这些方法。@JimMischel我知道I.toString(“x”);设置文本格式,但如何将“a”转换为十六进制而不在16进制中指定其格式?
“a”
已经是一个十六进制数字字符串,您无法将其转换为十六进制。您可以使用
ToInt32(“a”,16)
将十六进制数字字符串
“a”
转换为相应的整数
0x0a
,但如果您使用十六进制格式说明符将其转换回字符串,您只会得到
“a”
请再说一遍。那么,在这一行中,您到底有什么困难理解的呢?也许您应该一步一步地编写它,并在调试器中执行一步。例如,
inti=Convert.ToInt32(“a”)。然后查看
i
的值。然后
string s=i.ToString(“x”)
并检查
s
的值。这会让你了解这些事情的作用。或者,您可以在文档中查找这些方法。@JimMischel我知道I.toString(“x”);设置文本格式,但如何将“a”转换为十六进制而不在16进制中指定其格式?
“a”
已经是一个十六进制数字字符串,您无法将其转换为十六进制。您可以使用
ToInt32(“a”,16)
将十六进制数字字符串
“a”
转换为相应的整数
0x0a
,但如果您将