2009-12-01 7 views
5

저는 C++ 프로그램을 Java로 변환하고 다음과 같은 방법으로 완전히 망가졌습니다. 이 방법이 무엇을하고 있는지 설명 할만큼 충분히 친절하십니까?C++ 비트 패턴을 Java로 변환

long TSBCA::GetSignedValue(const NDataString &value) 
    { 
     static NDataString s;  
     s = value; 

     long multiplier(1); 
     size_t len(s.Len()); 
     if (len != 0) 
     { 
      if (s[0] >= (char)0xB0 && s[0] <= (char)0xB9) 
      { 
      s[0] &= 0x7F; //Bit Pattern: 0111 1111 
      multiplier = -1; 
      } 
      else if (s[len - 1] >= (char)0xB0 && s[len - 1] <= (char)0xB9) 
      { 
      s[len - 1] &= 0x7F; //Bit Pattern: 0111 1111 
      multiplier = -1; 
      } 
      else 
      multiplier = 1; 
     } 
     else 
      multiplier = 1; 
     return s.ToLong() * multiplier; 
    } 

편집 :

내 초기 Java 버전 :

private long getSignedValue(final String value){ 

     byte[] bytes = value.getBytes(); 
     int length = bytes.length; 
     long multiplier = 1L; 

     if (bytes.length > 0){ 
      if (bytes[0] >= (char)0xB0 && bytes[0] <= (char)0xB9){ 


      bytes[0] &= 0x7F; //Bit Pattern: 0111 1111 
      multiplier = -1; 
      } 
      else if (bytes[length - 1] >= (char)0xB0 && bytes[length - 1] <= (char)0xB9) 
      { 
       bytes[length - 1] &= 0x7F; //Bit Pattern: 0111 1111 
      multiplier = -1; 
      } 
      else 
      multiplier = 1; 
     } 
     else 
      multiplier = 1; 
     return Long.parseLong(Arrays.toString(bytes))* multiplier; 
} 

내가 잘 했나요?

+0

NDataString? 목표 C가 아닌가요? –

+0

회사 코드를 온라인으로 게시하는 대신 문제를 약간 격리시키지 않으시겠습니까? –

+0

BTW, 복잡하고 복잡한 것처럼 보이기 때문에 이것이 마음을 아프게한다면, 좋습니다! 나는 그것을 선명하고 명확한 코드의 예라고 부르지 않을 것이다. –

답변

1

바이트 문자열 (즉, 텍스트가 아닌)을 가져 와서 길이가 길어집니다. 그것은 많은 구현 특정 것들에 의존하고, 깨진 것처럼 보입니다 : 그것은 두 개의 다른 장소에서 부호 비트를 추출하고 있습니다. 또 다른 문제는 불필요한 재진입 (정적 변수로 인한)입니다.

+0

코드가 변환되는 경우 제대로 작동한다고 가정하는 것이 적절하며 반드시 "손상된"것은 아닙니다. 기호 구현은 예상치 못한 이상한 프로토콜 일 수 있지만, 그것이 깨진 것, 어색한 것만을 의미하지는 않습니다. – Tenner

+0

이것이 내가 부러진 것처럼 보였던 이유입니다. 분명히 작성된 정확한 스펙이 없습니다. –

+0

내가 제대로했으면 편집 해 주실 수 있겠습니까? 고맙습니다. –

1
s[0] &= 0x7F; 

헥사 7F 또는 환언 비트와 s[0]은 바이트 값 오프 부호 비트 스트립을 의미한다. s[len-1]와 같은 , 그래서 :

  • 처음 또는 마지막 자리 추가 부호 비트 (0x30있는 숫자 문자열 얻어 - '9'0xB0 - - 0xB9와 동일한 범위 '0'0x39 ==을 0x80 비트 세트.)
  • 스트립 승수
  • 로 기억 비트에 서명 기호를
  • 수익률을 설정하는 승수를 사용하여 숫자 문자열 인수를 해석하는 값

편집 :이 의도 한대로 작동 새로운 코드를 확인하기 위해 몇 가지의 JUnit 테스트를 작성해야하지 않습니다

  • :

    코드를 검토하는 것은 나에게 다음과 같은 발언에 이르게 그들은 당신이 기대하는 것을 수행합니다.

  • 마법 상수를 별도의 상수에 두십시오.
  • byte을 비교할 때 상수를 사용하십시오 (부호 사인)
  • 나머지는 괄호를 가져야하며이 경우에는 불필요합니다.
  • new String(byte[])을 사용하면 Arrays 유틸리티 클래스가 아닌 문자열을 재구성 할 수 있습니다.

이이 버전으로 날 리드 :

// Bit Pattern: 0111 1111 
private static final int BYTE_7F = 0x7F; 

// '0' with sign bit set 
private static final byte BYTE_NEGATIVE_0 = (byte) 0xB0; 

// '9' with sign bit set 
private static final byte BYTE_NEGATIVE_9 = (byte) 0xB9; 


private long getSignedValue(String value) { 

    byte[] bytes = value.getBytes(); 
    final int length = bytes.length; 
    long multiplier = 1; 

    if (0 < length) { 
     if (bytes[0] >= BYTE_NEGATIVE_0 && bytes[0] <= BYTE_NEGATIVE_9) { 

      bytes[0] &= BYTE_7F; 
      multiplier = -1; 

     } else if (bytes[length - 1] >= BYTE_NEGATIVE_0 && bytes[length - 1] <= BYTE_NEGATIVE_9) { 
      bytes[length - 1] &= BYTE_7F; 
      multiplier = -1; 
     } 
    } 

    return Long.parseLong(new String(bytes)) * multiplier; 
} 

는 여전히 올바른 주석 추가에 주목하고 문서의 용어와 일치를 가져 상수 이름을 업데이트해야합니다.

+0

내가 제대로했으면 편집 해 주실 수 있겠습니까? 고맙습니다. –

0

이상한 버전의 기호 (양수 또는 음수)를 테스트하는 것처럼 보입니다.첫 번째 또는 마지막 (하지만 선호하는 첫 번째) 문자가 0xB00xB9 사이에있는 경우 가장 높은 자리 비트를 0x300x39 사이에서 만들고 '0'에서 '9' 사이의 숫자로 해킹합니다. 그런 다음 정상적인 인간이 알고있는 것처럼 음수 기호로 숫자를 반환하십시오.

+0

잘했으면 EDIT를 한번보세요. 고맙습니다. –