0

我进行了以下编码以将十六进制十进制转换为整数。[我的算法]

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 库中发布任何方便的东西。

4

3 回答 3

0

您可以只使用字符本身来检查和减去,而不依赖于实际的字符集。所以,而不是,例如

number = (char)(c - 48);

采用

number = (char)(c - '0');

这样,您就可以让框架/编译器为您与实际的字符集进行对话。这也是通常在 C/C++ 中完成的方式。

一般来说,使用 C# 你不需要担心你的代码“在所有操作系统中”工作,因为正式它只会在 Windows 中运行。但是,如果更改了默认字符集,那么您的代码将会中断。

于 2012-09-06T12:16:15.470 回答
0

您需要验证您的字符串是否仅包含有效的十六进制数字,如果您看到无效的数字,则抛出异常。

于 2012-09-06T12:17:29.013 回答
-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; }

于 2015-12-15T14:31:07.937 回答