diff --git a/core/shared/src/main/scala/scodec/bits/BitVector.scala b/core/shared/src/main/scala/scodec/bits/BitVector.scala index f6baa5c9..da6be7ea 100644 --- a/core/shared/src/main/scala/scodec/bits/BitVector.scala +++ b/core/shared/src/main/scala/scodec/bits/BitVector.scala @@ -770,13 +770,13 @@ sealed abstract class BitVector extends BitwiseOperations[BitVector, Long] with */ final def sliceToByte(start: Long, bits: Int, signed: Boolean = true): Byte = { if (start % 8 != 0) drop(start).sliceToByte(0, bits, signed) - else if (isEmpty) 0.toByte + else if (isEmpty || bits == 0) 0.toByte else getByte(start, bits, signed) } private def getByte(start: Long, bits: Int, signed: Boolean): Byte = { require(sizeGreaterThanOrEqual(start + bits) && bits >= 0 && bits <= 8) - var result = 0x0ff & getByte(0) + var result = 0x0ff & getByte(start / 8) if (bits != 0) result = result >>> (8 - bits) // Sign extend if necessary if (signed && bits != 8 && ((1 << (bits - 1)) & result) != 0) { diff --git a/core/shared/src/test/scala/scodec/bits/BitVectorTest.scala b/core/shared/src/test/scala/scodec/bits/BitVectorTest.scala index e2a74d8e..cc719783 100644 --- a/core/shared/src/test/scala/scodec/bits/BitVectorTest.scala +++ b/core/shared/src/test/scala/scodec/bits/BitVectorTest.scala @@ -576,6 +576,14 @@ class BitVectorTest extends BitsSuite { hex"001122334455".bits.slice(-21, -5) shouldBe hex"".bits } + test("sliceToByte") { + forAll { (x: BitVector, offset0: Long, sliceSize0: Int) => + val offset = if (x.nonEmpty) (offset0 % x.size).abs else 0 + val sliceSize = (sliceSize0 % 9).abs.min((x.size - offset).toInt) + x.sliceToByte(offset, sliceSize).toInt shouldBe x.drop(offset).take(sliceSize.toLong).toInt() + } + } + test("highByte") { BitVector.highByte.toBin shouldBe "11111111" }