我做了以下代码,将十六进制转换为整数。我的算法
private static void ConvertFromBase16(string value)
{
value = value.ToUpper();
int result = 0;
int incrementor = 0;
for (int i = value.Length-1; i >= 0; i-- )
{
char c = value[i];
char number;
if (c > 64)
{
number = (char)(c - 55); //Ascii character for A start from 65.in hex
//its 10, so i have subtracted 55 from it.
}
else
{
number = (char)(c - 48); //Ascii character for 0 is 48, so subtracting
//48
}
int n = (int) number;
result += (number* (int) Math.Pow(16 , incrementor));
incrementor++;
}
Console.WriteLine(result);
}正如您所看到的,在上面的代码中,我使用ascii字符进行转换,而不是使用传统的case条件。我很怀疑,这是否会在所有操作系统上都有效,并产生适当的结果。
请有人建议我,这是不是正确的方法,不容易出错?
PS:我知道,使用带有全球化文化的.net默认库方法int.parse进行转换。为了学习数据结构的概念,我想手动完成这项工作。所以请不要在默认的.net库中发布任何有用的东西。
发布于 2012-09-06 20:16:15
您可以只使用字符本身来检查和减去,独立于实际的字符集。所以不是,举个例子
number = (char)(c - 48);使用
number = (char)(c - '0');这样,您就可以让框架/编译器为您完成与实际字符集的对话。这也是在C/C++中通常采用的方法。
一般来说,使用C#你不需要担心你的代码在“所有操作系统”下都能正常工作,因为无论如何它都只能在Windows上运行。但是如果默认字符集发生了变化,那么你的代码就会崩溃。
发布于 2012-09-06 20:17:29
您需要验证您的字符串是否只包含有效的十六进制数字,如果看到无效的十六进制数字,则抛出异常。
发布于 2015-12-15 22:31:08
这是我的实现public static uint UintFromHex(ref byte[] data, int offset, int len) { uint value = 0; byte number; byte d; for(int i = offset; i<offset+len; i++) { d = data[i]; if(d>=0x30 && d<=0x39) { number = (byte)(d-0x30); } else if(d>=0x41 && d<=0x46) { number = (byte)(d-55); } else if(d>=0x61 && d<=0x66) { number = (byte)(d-87); } else throw new ArgumentOutOfRangeException(); value += (uint)(number <<((len-i-1)*4)); } return value; }
https://stackoverflow.com/questions/12299769
复制相似问题