2013-03-23 5 views
1

저는 자바를 배우기 시작했습니다. 그리고 첫 번째 도전 과제로 MP3에서 ID3v1 태그를 읽으려고합니다. MP3의 마지막 128 바이트를 바이트 배열로 읽어서 거기에서 위로 나눕니다. 유효한 ID3 태그를 찾았는지 확인하려면 배열의 처음 3 바이트를 문자열로 변환하고 "태그"와 비교하십시오. 문제는 "TAG"문자열과 일치하지 않는 바이트에서 구성된 문자열입니다. Eclipse 디버거에서 실행해야하는 것처럼 보입니다.자바 - 바이트를 문자열로 변환하고 다른 바이트와 비교하기

아래 코드를 붙여 넣었습니다. 누구나 내가 잘못 생각하고 있습니다.

byte tagBytes[] = {84, 65, 71}; //Normally filed from a file, just here as an example. 
String tagHeader = null; //String to hold tag header 
tagHeader = Character.toString((char)tagBytes[0]) + 
      Character.toString((char)tagBytes[1]) + 
      Character.toString((char)tagBytes[2]); 
if (tagHeader != "TAG"){ 
    System.out.println("No ID3v1 tag found"); 
    return null; 
} 
+1

[비교하는 방법 문자열을 내가 n Java] (http://stackoverflow.com/search?q=java+string+compare) – Eran

답변

2

문자열은이 검사로 ==에 의해 비교 될 수 없다. 대/소문자를 구분하지 않고 비교하려면 "TAG".equals(tagHeader) 또는 "TAG".equalsIgnoreCase(tagHeader)을 사용하십시오. @Vulcan 제안 단순히, 심지어

StringBuilder sb = new StringBuilder(); 
for(int i = 0; i < 3; i++) { 
    sb.append((char)tagBytes[i]); 
} 
tagHeader = sb.toString(); 

을 또는 :

또한과 같이, 당신의 문자열 건물을 단순화 할 수

tagHeader = new String(tagBytes,0,3); 

당신은 가능성뿐만 아니라 캐릭터 세트를 지정할 수 있습니다 그렇지 않으면 바이트가 잘못 변환 될 수 있습니다. 데이터의 인코딩 방법에 따라 다른 문자 집합을 지정할 수 있습니다 :이 제대로 문자열로 바이트를 켜고 것이다

tagHeader = new String(tagBytes,0,3,Charset.forName("UTF-8")); 
+1

또는'tagHeader = new String (tagBytes)'입니다. – Vulcan

+0

잘 부탁드립니다. 제안에 감사드립니다. – dimo414

0

변화 tagHeader != "TAG"!tagHeader.equals("TAG")

에 현재 당신이 비교하는 메모리 주소가 아닌 실제 값.

나는 이것을 명확하게하기 위해 이렇게 썼다. null 안전 코드의 경우 항상 리터럴을 먼저 사용해야합니다.

"TAG".equals(tagHeader) 
1

당신이 (당신이 인코딩을 알고있는 경우 나) 그들은 모두 ASCII가 있는지 확인하는 경우가 String에 바이트를 변환 할 수 있습니다. 그런 다음 equals이 아닌 !=과 비교해야합니다. 나중에 동일한 인스턴스가 아닌지 확인합니다. 귀하의 경우에는 항상 다른 인스턴스입니다.

byte tagBytes[] = {84, 65, 71}; 
    String tagHeader = new String(tagBytes, Charset.forName("US-ASCII")); 
    if (!"TAG".equals(tagHeader)){ 
     System.out.println("No ID3v1 tag found"); 
     return null; 
    } 

아니면 그냥이 작업을 수행하여 모두 중복 String 객체를 생성 피할 수는 : 메모리에 문자 참조가 같은 경우

byte tagBytes[] = {84, 65, 71}; 
    if (!('T' == tagBytes[0] && 'A' == tagBytes[1] && 'G' == tagBytes[2])){ 
     System.out.println("No ID3v1 tag found"); 
     return null; 
    } 
1

:

byte tagBytes[] = {84, 65, 71}; 
String s = new String(tagBytes, Charset.forName("US-ASCII")); 

귀하의 솔루션은 작동합니다. 그것은 당신의 비교가 문제입니다. 당신이 원하는 : 문자열의 경우

if (!tagHeader.equals("TAG")) { 

!= 또는 == 테스트는 두 문자열이 같은 인스턴스가 아닌 같은 값 있음. 값으로 비교하려면 equals() 메서드를 사용해야합니다.전체 바이트 배열을 문자열로 변환 된 경우

String s = new String(tagBytes, 0, 3, Charset.forName("US-ASCII")); 

, 당신은 "TAG"로 시작하지 않는 경우보고 싶어 :

변형 : 바이트 배열의 일부만을 선택하려면 : 당신이 같이 할 수있는 간단한 방법으로

if (!tagHeader.startsWith("TAG")) { 
1

은 다음과 같습니다

public static void main(String[] args) { 
    byte tagBytes[] = {84, 65, 71}; //Normally filed from a file, just here fro example. 
    String tagHeader = null; //String to hold tag header 
    tagHeader = new String(tagBytes); 
    if (!tagHeader.equals("TAG")){ 
     System.out.println("No ID3v1 tag found"); 
    } 
} 
관련 문제