2012-09-06 89 views
0

我做了如下編碼,將十六進制小數轉換爲整數。 [我的算法]HtoI [HexaDecimal to Integer] - 使用ASCII碼

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

你可以使用字符本身來檢查和減少,與實際的字符集無關。 因此,而不是,例如

number = (char)(c - 48); 

使用

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

這樣,你讓框架/編譯器做的談話爲你實際的字符集。這也是通常在C/C++中完成的方式。

一般來說,使用C#,您無需擔心代碼在「所有操作系統」中工作,因爲它正式只能在Windows中運行。但是如果默認字符集有變化,那麼你的代碼將會中斷。

+0

不錯。而在if情況下使用(c> ='A') – sukunrt

+0

ASCII代碼是通用的。 http://en.wikipedia.org/wiki/ASCII它不會改變我相信。感謝wutz提供的建議,以及它如何完成c或C++。確保我是否在正確的道路上。 :) – VIRA

0

您需要驗證您的字符串是否僅包含有效的十六進制數字,並在發現無效數字時拋出異常。

+0

我已經這樣做了,實際上我立即發送轉換後的十六進制到這個方法。這不是一個問題,因爲我只是開發算法和他們的鍛鍊。所以,請給我我想要的信息。即,這是否是正確的方法,並且不會容易出錯? – VIRA

-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; }