2013-05-22 60 views
0

在下面的函数中,我遇到了一个数组超出界限的问题。它应该像这样将一串数字转换为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(); 
    } 

Btw。如果StringElement包含A到F,则不起作用。

+0

当然,如果(!“”.equals(StringElement))应该是第一个if条件,但是您的解决方案对我来说是正确的。谢谢 :) – Noob

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

行引发异常。

你试图访问tempBCD第[i + 1],其中i具有最大值tempBCD.length() - 1和数组索引从0

开始您可以像:

创建temp1BCD的长度比tempBCD长1,然后做所有的事情。

+1

正确。我意识到这是问题。但是我找不到适合它的解决方案,它将涵盖奇数和偶数长度的字符串 – Noob