package ixee.cryptopals.utils import ByteUtils.WithBitOpts object ConversionUtils { def hexStr2Bytes(s: String): Iterator[Byte] = padToByte(s).grouped(2).map(byteStr2Byte) def byteStr2Byte(str: String): Byte = charSeq2Byte(str.toSeq) def charSeq2Byte(seq: Seq[Char]): Byte = seq.map(octet2nibble).reduce(joinNibbles) def joinNibbles(a: Byte, b: Byte): Byte = ((a @<< 4) @+ b) def padToByte(s: String): String = if (s.length % 2 != 0) "0" + s else s def octet2nibble(c: Char): Byte = { (c.toLower match { case c if c >= 'a' && c <= 'f' => (c - 'a') + 10.toByte case c if c >= '0' && c <= '9' => c - '0' case _ => throw new IllegalArgumentException(s"Invalid hexadecimal character: $c") }).toByte } def hexStr2Base64String(s: String): String = { import io.github.marklister.base64.Base64._ hexStr2Bytes(s).toArray.toBase64 } }