2012-09-06 3 views
0

다음 코딩을 사용하여 16 진수를 정수로 변환했습니다. [내 알고리즘]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 문자를 사용했습니다. 이것이 모든 OS에서 작동하고 적절한 결과를 창출 할 수 있을지는 의문입니다.

제발 나에게 이것이 올바른 접근법인지와 오류 발생 가능성이 없는지 제언 할 수 있습니까?

추 신 : 저는 세계화 문화와 함께 .net 기본 라이브러리 메소드 int.parse를 사용하여 변환합니다. 데이터 구조 개념을 배우기 위해이 작업을 수동으로 수행하려고합니다. 따라서 기본 .net 라이브러리에서 편리하게 아무것도 게시하지 마십시오.

답변

0

실제 문자 세트와 독립적으로 확인하고 빼기 위해 문자 자체를 사용할 수 있습니다. 예를

number = (char)(c - 48); 

사용

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

당신이 프레임 워크/컴파일러를하자이 방법에 대한 그래서 대신에, 당신을위한 실제 캐릭터 세트로 대화를 할. 이것이 C/C++에서 일반적으로 수행되는 방식입니다.

일반적으로 C#에서는 "모든 OS에서"작동하는 코드에 대해 걱정할 필요가 없습니다. 공식적으로 Windows에서만 실행되기 때문입니다. 그러나 기본 charset이 변경되면 코드가 손상됩니다.

+0

Nice입니다. 그리고 경우에 사용 (c> = 'A') – sukunrt

+0

ASCII 코드는 일반적입니다. http://en.wikipedia.org/wiki/ASCII 나는 믿을 변화가 없을 것이다. 귀하의 제안에 대해 감사 드리며 어떻게 C 또는 C++로 완료했는지에 대해 감사드립니다. 올바른 길을 가졌는지에 대한 생각. :) – VIRA

0

문자열에 유효한 16 진수 만 포함되어 있는지 확인하고 유효하지 않은 문자열이 있으면 예외를 throw해야합니다.

+0

나는 이미 이것을했는데, 사실 나는 즉시이 방법으로 10 진수로 변환 된 헥사를 보낸다. 내가 알고리즘과 운동을 개발하고 있기 때문에 이것은 전혀 문제가되지 않습니다. 그러니 제게 원하는 정보를주세요. 즉, 이것이 올바른 접근 방식인지 오류 발생 가능성이 없는지 여부 – 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; }