【问题标题】:binary < ascii > hex convert二进制<ascii>十六进制转换
【发布时间】:2012-11-14 13:23:47
【问题描述】:

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

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

你能解释一下这两行吗?

【问题讨论】:

  • 那么究竟你在这行中有什么难以理解的?
  • 也许你应该一次写一个,在调试器中一步一步写。例如,int i = Convert.ToInt32("a");。然后看看i的值是多少。然后string s = i.ToString("x"); 并检查s 的值。这将使您了解这些事情的作用。或者,您可以查找这些方法的文档。
  • @JimMischel 我知道 i.toString("x");格式化文本,但如何将“a”转换为十六进制而不指定其以 16 为基数?
  • "a" 已经是一串十六进制数字,你不能“把它”变成十六进制。您可以使用ToInt32("a", 16) 将十六进制数字字符串"a" 转换为相应的整数0x0a,但是如果您转身将其转换回字符串,使用十六进制格式说明符,您只会得到"a" 返回再次。

标签: c# binary hex ascii converter


【解决方案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作为分隔符(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,您正在将十六进制数字字符串“转换”为二进制数字的“等价”字符串。

【讨论】:

  • 好的,现在我理解它已经被分成一口大小的块了,但是我的第一行有没有猜到的等价物?也感谢您的深入解释。
  • 我不确定第一行的开头是什么;如果您使用Convert.ToInt32("a", 16).ToString("x");,那么它会“运行”,但它仍然不会做任何有用的事情。 (这也忽略了您甚至没有将结果存储在任何地方的事实。)
  • 哦,它将值存储在字符串数组中,我只是没有显示,因为我知道如何将 ect 附加到字符串。基本上它的意思是将字符串转换为十六进制。
  • 这就是我的想法,但它没有这样做。这不是ToInt32() 所做的。那行代码会引发异常。此外,您需要非常小心地说“将字符串转换为十六进制”之类的内容,因为这没有技术意义,如果您不是非常清楚自己想要完成什么,您将最终完成了错误的事情。
猜你喜欢
  • 1970-01-01
  • 2014-10-30
  • 2014-06-22
  • 1970-01-01
  • 2015-05-22
  • 2012-06-26
  • 2011-10-11
  • 2016-02-09
相关资源
最近更新 更多