1

これは非常に奇妙な問題です。

base64 文字列をデコードし、の前に最初の部分を取得できる単純なクラスがあります:

import scala.util.{Success, Try}
import org.apache.commons.codec.binary.Base64

class IdDecoder {

  def decode(token: String): Option[String] = {
    if (token.isEmpty)
      None
    else
      Try(new String(Base64.decodeBase64(token.getBytes)).split(":")(0)) match {
        case Success(id) => Some(id)
        case _ => None
      }
  }

}

そして、文字列をデコードするメソッドを定義します

object StrangeToken {

  def main(args: Array[String]) {
    decode()
  }

  def decode() = {
    val token = "InternalServerError"
    val Some(id) = (new IdDecoder).decode(token)
    println("### StrangeToken's id len:" + id.length)
    id.toCharArray.foreach(c => println(c.toInt))
    id
  }

}

プレーン コードとして実行され、ID の長さは 15 です

sbt のコンソール、IDEA、または本番環境で実行すると、結果は次のようになります。

### StrangeToken's id len:15
34
123
94
65533
118
65533
73
65533
65533
122
65533
43
0
0
0

spec2 テストとして実行、ID の長さは 14

しかし、spec2 で実行すると、次のようになります。

"id decoder" should {
  "get decoded string whose length is 15" in {
    val id = StrangeToken.decode()
    id.length must be equalTo 15
  }
}

このテストは失敗し、結果は次のとおりです。

### StrangeToken's id len:14
34
123
94
198
118
8226
73
205
212
122
177
43
198
228

spec2で結果が違う理由がよくわかりません。

4

1 に答える 1

1

sbt スクリプトで-Dfile.encoding=UTF8.

new String(bytes)デフォルトのエンコーディングを使用します。コンストラクターに文字セットを指定できます。

2番目の推測:

-codec ライブラリのさまざまなバージョンがTest構成などに含まれています。

バージョンを 1.1 に戻すと、15 になります。

正直なところ、それはもともと私の 2 番目の推測でした。-codec プロジェクトには多くの歴史があるため、非互換性や動作の変更は驚くべきものではありません。おそらく、数字の 14 を引き出す行動は、より適合的です。

「一般的な」依存関係が依存関係ツリーに 2 回現れることも驚くべきことではありません。

于 2014-04-04T17:35:24.980 に答える