2009-12-01 6 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; 
    } 

EDIT:

私の最初の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?それは客観的なものではないのですか? –

+0

あなたの会社のコードをオンラインで掲載するのではなく、少しだけ問題を特定したくないですか? –

+0

ところで、これが複雑で複雑なように見えるので、これがあなたの心を吹き飛ばしたならば、良い!私はそれを良い、明確なコードの例と呼んでいません。 –

答えて

1

バイト文字列(テキストではありません)を使用しています。長い文字列に変換しています。これは、多くの実装固有のものに依存し、壊れているように見えます。つまり、2つの異なる場所から符号ビットを抽出しています。別の問題は、不必要な非リエントラント(静的変数に起因する)です。

+0

これはコードが変換されている場合、それが動作し、必ずしも "壊れている"というわけではないと仮定することは公正です。サインの実装は、あなたが期待していない奇妙なプロトコルかもしれませんが、それはそれが壊れている、単なる厄介なことを意味するものではありません。 – Tenner

+0

これは私がそれが壊れていると言った理由です、明らかに私はそれが書かれている正確な仕様を持っていません。 –

+0

私が正しく行っていれば、EDITをご覧ください。ありがとうございました。 –

1
s[0] &= 0x7F; 

ビット及び六角7F又は言い換えればとs[0]、バイトオフ値符号ビットを取り除くことを意味します。 s[len-1]と同じ 、そう:

  • は最初または最後の桁が符号ビットを加えた(0x30数字列、かかる - 0x39 == '0'から'9'0xB0 - 0xB9は同じ範囲であるが0x80ビットセット。)符号ビット
  • ストリップ、乗算器
  • その符号
  • リターンを設定するために乗算器を用いた数値文字列引数を解釈するようにそれを覚えます値

編集

あなたのコードの確認は、以下の発言に私をリード:意図した通りに動作しません

  • 、チェックするために、新しいコードのためのいくつかのJUnitテストを書くようにしてくださいあなたが期待していることを彼らがしていること
  • マジックナンバーを別の定数に入れてください。
  • byteを比較すると定数
  • ダングリングelseは中カッコを取り、この場合は不要です。
  • 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

もし私が正しいとしたら、EDITを見てください。ありがとうございました。 –

0

奇妙なバージョンの兆候(肯定的または否定的)をテストしているように見えます。最初の文字または最後の文字(ただし最初の文字が好きな場合)が0xB00xB9の場合は、いずれの文字の最上位ビットをハックします(0x300x39の間、数字は'0'から'9'になります)。人間がそれを知っているのと同じように、数字を負の符号で返します。

+0

私が正しく行っていれば、EDITをご覧ください。ありがとうございました。 –

関連する問題