2012-04-27 4 views
1

REST 서비스를 통해 바이트 배열을 전송합니다. 그것은 String으로 수신 중입니다. 여기에 그것의 발췌입니다. 시작 태그와 종료 태그. 구문 분석 String JavaME에서 바이트 배열 respresentation

[0,0,0,0,32,122,26,65,0,0,0,0,96,123,26,65,0,0,0,0,192,123,20,65,0,0,0,0,0,125,20,65,71,73,70,56,57,97,244,1,244,1,247,0,0,51,85,51,51,85,102,51,85,153,51,85,204,51,85,255,51,128,0,51,128,51,51,128,102,51,128,153,51,128,204,51,128,255,51,170,0,51,170,51,51,170,102,51,170,153,51,170,204,51,170,255,51,213,0,51,213,51,51,213,102,51,213,153,51,213,204,51,213,255,51,255,0,51,255,51,51,255,102,51,255,153,51,255,204,51]

이제 누군가가 실제로 작동하는 Base64로 디코더를 가지고 블랙 베리를 필요로 base64로 인코딩 된 문자열로 보내기 제안하기 전에. 그러나 아아, 64k 이상의 파일에는 실패하고 alsorts는 시도했습니다.

어쨌든 이것은 필자가 뭘하려 :

 str = str.replace('[', ' '); 
     str = str.replace(']', ' '); 
     String[] tokens = split(str,","); 
     byte[] decoded = new byte[tokens.length]; 
     for(int i = 0; i < tokens.length; i++) 
     {   
      decoded[i] = (byte)Integer.parseInt(tokens[i]);    
     } 

을하지만 실패합니다. split은 JAVA 구현과 같습니다. found here.

논리적으로 작동해야합니까? 그러나 그것의. JavaME/Blackberry입니다. 아니 자바 대답하시기 바랍니다 (그들이 javaME에서 작동하지 않는 한).

답변

2

두 가지 문제점 중 하나는 경미한 것이며 하나는 고통입니다. Minor : 공백 (Nikita가 언급 한대로) Major : 바이트에 캐스팅 ... java는 부호없는 바이트 만 가지고 있기 때문에 128 이상은 int에서 byte로 캐스팅 할 때 음수가됩니다.

str = str.replace('[',' '); 
    str = str.replace(']', ' '); 
    String[] tokens = split(str,",");//String[] tokens = str.split(","); 
    byte[] decoded = new byte[tokens.length]; 
    for (int i = 0; i < tokens.length; i++) { 
     decoded[i] = (byte) (Integer.parseInt(tokens[i].trim()) & 0xFF); 
    } 
    for(byte b:decoded) { 
     int tmp = ((int)b) & 0xff; 
     System.out.print("byte:"+tmp); 
    } 

(BTW : 구현 base64로 인코더/디코더, 특히 어려운 일이 아니다 -하지만 프로젝트에 대한 "잔인한"수 있습니다) 내가 바이트 배열을 보내 Base64로 인코딩 된 문자열을 사용하는 것이 좋습니다

+0

웹에서 이미지를 끊임없이 전송할 때 과도하지 않습니다. Ive는 base64 디코더의 많은 다른 implentations를 시도했고 항상 작동하지 않습니다. 디코딩 오류가 발생했습니다. 64k 이상에서는 정적 메소드가 구문을 분석 할 수 없으며 (64k 미만인 경우 정적 메소드로 작동) 디코딩 할 수있는 무언가에 대해 읽기 메소드가 무작위로 실패합니다. 비록 부호없는 바이트 관찰을 주셔서 감사합니다! – Doomsknight

+0

잘 작동합니다. 감사. 그리고 당신이 한 일을 설명하기 위해서 (부호없는 바이트의 관점에서). 분할 코드에이 코드를 삽입하려고합니다. 배열을 두 번 통과하는 포인트가 없습니다.). – Doomsknight

+1

사용하려고했던 base64 구현을 살펴보고 결과를 로컬 버퍼에 저장하는 대신 (디바이스에서 최대 64k는 내 추측이 될 것입니다.) 스트림을 사용하고 입력이있는 스트림 하나를 출력 - 아마도 출력 파일 또는 뭔가 갈 수 있을까요? 대부분의 구현에서 시작되는 부분이 아닌 4 바이트 블록마다 패딩을 처리해야 할 수도 있습니다.라파엘 (Rafael)의 답변 링크에있는 링크의 코드는 좋은 기반처럼 보입니다. – esej

1

하지 공백, 빈 문자열과 브래킷을 교체 : 귀하의 경우에는

str = str.replace('[', ''); 
str = str.replace(']', ''); 

당신이 배열 다음 한 :

[" 0", "0", "0", ..., "204", "51 "] 

첫 번째 요소 " 0"는 정수로 구문 분석 할 수 없습니다.

+0

"0"을 정수로 파싱 할 수없는 이유는 무엇입니까? 왜냐하면''''는 유효하지 않은 문자 상수이기 때문에 나는 공간을 사용했다. 그리고 그 공간을 파싱한다고 가정했습니다. javaME atleast에서'' ''를 사용하는 것은 불가능합니다. 그러나 문제를 정렬하기 전에 .trim()을 호출 할 수 있습니다. – Doomsknight

1

.

여기에 a post with link to Base64 library for J2ME이 있습니다.

이 방법을 사용하면 바이트 배열을 문자열로 변환하고 나중에이 문자열을 바이트 배열로 변환 할 수 있습니다.

+0

그래, 내 질문에 나는 벌써 이것을 시험해 보았다. 당신이 제공 한 링크는'byte []'보다는'string'의'base64String' 표현에 대해서만 사용할 수 있습니다. – Doomsknight