2013-05-22 6 views
0

в следующей функции, у меня есть некоторые проблемы с проблемой Array из Bounds. Он должен преобразовать строку цифр в формат BCD следующим образом: «12345» -> 0x01 0x23 0x45. Длина строки не известна.Строка цифр в 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

Это отлично работает для меня. Попробуйте это;) Я только что заменил выходной поток для целей тестирования, реорганизовал код и добавил «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(); 
    } 

КПП. это не работает, если StringElement содержит от A до F.

+0

Конечно, если (! "" .equals (StringElement)) должно быть первым if-условием, но ваше решение выглядит правильно для меня , Благодаря :) – Noob

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

линия ведет исключение.

Вы пытаетесь получить доступ к tempBCD [я + 1], где я имеет максимальное значение tempBCD.length() - 1 и индекс массива начинается с 0.

Вы можете сделать это:

Создать temp1BCD с длиной 1 больше, чем tempBCD, а затем делать все вещи.

+1

Точно. Я понимаю, что это проблема. Но я не могу найти подходящее решение для него, которое будет охватывать строки нечетной и четной длины. – Noob

Смежные вопросы