我已经进行了以下编码以将十六进制十进制转换为整数。 [我的算法]
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字符进行转换,而不是使用传统的大小写条件。 我有点怀疑,这是否适用于所有操作系统并产生适当的结果。
请问有人可以告诉我这是否正确,不会出错?
PS: 我知道,使用.net默认库方法int.parse转换为全球化文化。我想手动执行此操作以学习数据结构概念。所以请不要在默认的.net库中发布任何方便的内容。
答案 0 :(得分:0)
您可以使用字符本身进行检查和减去,与实际的字符集无关。 因此,而不是,例如
number = (char)(c - 48);
使用
number = (char)(c - '0');
通过这种方式,您可以让框架/编译器为您进行实际的charset对话。这也是通常在C / C ++中完成的方式。
一般情况下,使用C#,您无需担心代码在“所有操作系统”中运行,因为官方它只会在Windows中运行。但是如果更改了默认字符集,那么代码就会中断。
答案 1 :(得分:0)
您需要验证您的字符串是否仅包含有效的十六进制数字,如果您看到无效的字符串则抛出异常。
答案 2 :(得分:-1)
这是我的实现
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;
}