2013-05-22 6 views
0

다음 함수에서 배열 바운더리 문제로 인해 몇 가지 문제가 있습니다. "12345"-> 0x01 0x23 0x45와 같이 BCD 형식으로 문자열을 변환해야합니다. String의 길이는 알려져 있지 않습니다. ByteArrayOutputStream에 대한 자릿수 문자열

public void StringtoBCD(String StringElement) 
{ 
ByteArrayOutputStream in = new ByteArrayOutputStream(); 
if (!" ".equals(StringElement)){ 
    int i=0; 
    byte[] tempBCD = StringElement.getBytes(); 
    for (i=0; i<tempBCD.length; i++){ 
     tempBCD[i]=(byte)(tempBCD[i]-0x30); 
     } 
     i=0; 
     if (tempBCD.length %2 !=0){ 
     in.write(0); 
     } 
     while(i<tempBCD.length){ 
     in.write((tempBCD[i]<<4)+tempBCD[i+1]); 
     i=i+2; 
    } 
    } 
} 

나는 성공없이

while(i<tempBCD.length){ 
in.write((tempBCD[i]<<4)+tempBCD[i+1]); 
if (i+3>(tempBCD.length)){ 
    i+= 1; 
    } 
    else { 
    i+=2; 
    } 
} 

같은 것을 시도했다. 나는 그것이 단순하다는 것을 아주 확신하지만, 나는 여기서 어떤 것을 감독하는 것처럼 보인다. 어떤 도움을 주시면 감사하겠습니다 :)

답변

1

나를 위해 잘 작동합니다. 그것을 시험해보십시오;) 방금 테스트 목적으로 출력 스트림을 교체하고, 코드를 재구성하고, 길이가 홀수 인 경우 String의 처음에 "0"을 추가했습니다.

public void StringtoBCD(String StringElement) { 
     PrintStream in = System.out; 
     if(StringElement.length()%2 == 1) { 
      StringElement= "0"+StringElement; 
     } 
     if (!" ".equals(StringElement)){ 
      byte[] tempBCD = StringElement.getBytes(); 
      for (int i=0; i<tempBCD.length; i++){ 
       tempBCD[i]=(byte)(tempBCD[i]-0x30); 
      } 
      for(int i = 0; i<tempBCD.length; i=i+2){ 
       in.write((tempBCD[i]<<4)+tempBCD[i+1]); 
      } 
     } 
     in.flush(); 
    } 

btw. StringElement에 A에서 F가 포함 된 경우에는 작동하지 않습니다.

+0

물론 if (! "". equals (StringElement))가 첫 if 조건이되어야하지만 솔루션이 나에게 맞아 보인다. . 감사 :) – Noob

1
in.write((tempBCD[i]<<4)+tempBCD[i+1]); 

라인이 예외가됩니다. 당신은 tempBCD에 액세스하려고

[I + 1] 내가 최대 값 tempBCD.length()가 어디 - 1과 배열 인덱스는 당신이 그것을 좋아합니까 수 0 ​​

에서 시작 :

만들기 tempBCD보다 길이가 1 인 temp1BCD를 작성한 다음 모든 작업을 수행하십시오.

+1

정확히. 나는 이것이 문제라는 것을 깨닫는다. 하지만 이상한 길이와 짝수 길이의 문자열을 모두 처리 할 수있는 적절한 솔루션을 찾을 수 없습니다. – Noob