情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

JavaでBigIntegerをバイト配列として扱う

バイト配列を多倍長整数型として扱い、計算を行いたいということは良くあります。

その場合、通常そのようなバイト配列は符号なしの多倍長整数として扱わなければなりませんが、Javaで標準で用意されているメソッドなどはバイト配列を符号付きのものとして扱ってしまうので問題があります。

そのため、(符号なしの)バイト配列を正のBigIntegerに変換したり、正のBigIntegerを(符号なしの)バイト配列に変換したりする関数を自作しました。

  def positiveBigIntegerToBytes(in: BigInteger, numBytes: Int): Array[Byte] = {
    if (in.compareTo(BigInteger.ZERO) < 0) {
      throw new Exception("negative value")
    }

    val bytes: Array[Byte] = new Array[Byte](numBytes)
    val biBytes: Array[Byte] = in.toByteArray
    for (i <- bytes.indices) {
      if (i < biBytes.length) {
        bytes(bytes.length - i - 1) = biBytes(biBytes.length - i - 1)
      }
      else {
        bytes(bytes.length - i - 1) = UByte.__(0)
      }
    }
    bytes
  }

  def bytesToPositiveBigInteger(in: Array[Byte]): BigInteger = {
    val bytes: Array[Byte] = new Array[Byte](in.length + 1)
    for (i <- bytes.indices) {
      if (i == 0) {
        bytes(i) = UByte.__(0)
      }
      else {
        bytes(i) = in(i - 1)
      }
    }
    new BigInteger(bytes)
  }

positiveBigIntegerToBytes関数が正のBigIntegerを(符号なしの)バイト配列に変換する関数で、bytesToPositiveBigInteger関数が(符号なしの)バイト配列を正のBigIntegerに変換する関数です。

動作をテストしてみます。

    for (i <- 0 until 500) {
      val bi: BigInteger = BigInteger.valueOf(i)
      val array: Array[Byte] = __.positiveBigIntegerToBytes(bi, 4)
      println(array.mkString(","))
      val bi2: BigInteger = __.bytesToPositiveBigInteger(array)
      println(bi2.toString)
    }

結果は下のようになりました。

0,0,0,0
0
0,0,0,1
1
0,0,0,2
2
0,0,0,3
3
(中略)
0,0,0,124
124
0,0,0,125
125
0,0,0,126
126
0,0,0,127
127
0,0,0,-128
128
0,0,0,-127
129
0,0,0,-126
130
0,0,0,-125
131
(中略)
0,0,0,-4
252
0,0,0,-3
253
0,0,0,-2
254
0,0,0,-1
255
0,0,1,0
256
0,0,1,1
257
0,0,1,2
258
0,0,1,3
259
(中略)
0,0,1,124
380
0,0,1,125
381
0,0,1,126
382
0,0,1,127
383
0,0,1,-128
384
0,0,1,-127
385
0,0,1,-126
386
0,0,1,-125
387
(中略)
0,0,1,-16
496
0,0,1,-15
497
0,0,1,-14
498
0,0,1,-13
499

上手く動作していることが分かります。

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-java, scala