2014-07-16 7 views
0

매우 구체적인 요구 사항이 있습니다. 데이터가 있습니다. 그 중 문자열과 공백은 EBCDIC로 변환되고 숫자는 16 진수로 변환됩니다.
예를 들어, 내 문자열은 "Test123"
테스트 => EBCDIC
123 => 16 진수입니다.
문자열의 모든 문자가 숫자인지 아닌지 확인한 다음 변환을 기반으로합니다.16 진수를 변환하지 않고 16 진수로 변환

byte[] dataBuffer = new byte[length]; 
     int i = 0; 

     if (toEBCDIC) 
     { 
      foreach (char c in data) 
      { 
       byte[] temp = new byte[1]; 
       if (Char.IsNumber(c)) 
       { 
        string hexValue = Convert.ToInt32(c).ToString("X"); 
        temp = Encoding.ASCII.GetBytes(hexValue);       
        dataBuffer[i] = temp[0]; 
       } 
       else 
       { 
        temp = Encoding.GetEncoding("IBM01140").GetBytes(c.ToString()); 
        dataBuffer[i] = temp[0]; 
       } 

       i++; 
      } 


      dataBuffer.CopyTo(array, byteIndex); 

숫자를 변환하려고하면 문제가 발생합니다. 출력을 메모리 스트림에 쓰고 파일에 쓰면되므로 출력을 바이트 배열로 유지해야합니다.
number의 16 진수 값을 얻은 다음이를 바이트로 변환하려고하면 실제 변환이 발생합니다.
"1"의 경우 16 진수 = 31입니다.
이제이 값을 변경하지 않고 바이트 단위로 유지하려고합니다. 나는 그것을 바이트 배열에 쓸 때 31 개만 남아 있어야한다고 말합니다. 그러나 GetBytes는 바이트 배열을 만들고, 3과 1을 각각 바이트로 변환합니다.
누구든지 이걸 도와주세요. !!

+1

EBCDIC ?! 우리 부모님조차도 그걸 기억할만큼 나이가 들지 않았습니다. – harold

+0

자릿수 형식을 알고 있습니까? 항상 000 <256 또는 또한 ## 0 또는 무엇? – TaW

답변

0

문제는 여기에 있습니다 :

ToString("X") 

는 이제 16 진수 문자열입니다. 그래서 당신의 예에서,이 시점부터 3과 1은 분리되어 있습니다.

문제를 해결하는 방법 : 변환하지 마십시오.

if (Char.IsNumber(c)) 
{ 
    dataBuffer[i] = (byte)c; 
} 

테스트되지 않았습니다. 나는 그것이 당신이 원하는 것이라고 생각합니다. 적어도, 그것은 당신이 마지막 단락에서 기술 한 것입니다. 숫자를 16 진수로 만들지는 않을 것입니다. ASCII로 만들 것이고, EBCDIC과 혼합하는 것은 조금 이상합니다.

+0

"1"을 16 진수 대신 10 진수로 변환합니다. 나는 변환의 결과로 31이 필요하지만 이것은 49가된다. – Anshul

+0

@ 안식일은 그렇지 않다. 그것은 바로 디버거에서 어떻게 보는지입니다. 0x31을 보려면 16 진수보기로 전환하십시오. 둘 다 단지 환상이며, '바이트'는 본질적으로 어떤 기지에도 없다. – harold

+0

고맙습니다. 나는 디버거를보고 혼란스러워했다. 16 진법으로 검사하면 정확한 값이 표시됩니다. 고맙습니다 :) – Anshul

0

char을 코드로 변환 한 다음 해당 코드를 string으로 변환합니다. 직접 코드를 대신, 두 번째 단계을 사용할 필요가 없습니다 :

if (Char.IsNumber(c)) 
{ 
    byte hexValue = Convert.ToByte(c);      
    dataBuffer[i] = hexValue; 
}