From de6987701b88430f95d1f477d195344cd1a2d5ef Mon Sep 17 00:00:00 2001 From: Robinson Date: Sun, 2 Jul 2023 11:27:16 +0200 Subject: [PATCH] Added more array extensions dealing with bytes (mostly) from Utils project --- src/dorkbox/bytes/ArrayExtensions.kt | 91 ++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/dorkbox/bytes/ArrayExtensions.kt diff --git a/src/dorkbox/bytes/ArrayExtensions.kt b/src/dorkbox/bytes/ArrayExtensions.kt new file mode 100644 index 0000000..d3c2417 --- /dev/null +++ b/src/dorkbox/bytes/ArrayExtensions.kt @@ -0,0 +1,91 @@ +/* + * Copyright 2023 dorkbox, llc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package dorkbox.bytes + +import dorkbox.bytes.Hash.charToBytes16 +import dorkbox.bytes.Hash.digest1 +import dorkbox.bytes.Hash.digest256 +import java.awt.SystemColor.text +import java.security.MessageDigest +import java.security.NoSuchAlgorithmException + + +object ArrayExtensions { + /** + * Gets the version number. + */ + const val version = BytesInfo.version +} + + +/** + * this saves the char array in UTF-16 format of bytes + */ +fun CharArray.charToBytes16(): ByteArray { + // NOTE: this saves the char array in UTF-16 format of bytes. + val bytes = ByteArray(this.size * 2) + for (i in this.indices) { + bytes[2 * i] = (this[i].code shr 8).toByte() + bytes[2 * i + 1] = this[i].code.toByte() + } + return bytes +} + +fun CharArray.charToBytesRaw(): ByteArray { + val length = this.size + val bytes = ByteArray(length) + for (i in 0 until length) { + val charValue = this[i] + bytes[i] = charValue.code.toByte() + } + return bytes +} + +fun IntArray.intsToBytes(startPosition: Int = 0, length: Int = this.size): ByteArray { + val bytes = ByteArray(length) + val endPosition = startPosition + length + for (i in startPosition until endPosition) { + val intValue = this[i] + if (intValue < 0 || intValue > 255) { + throw IllegalArgumentException("Int at index $i($intValue) was not a valid byte value (0-255)") + } + bytes[i] = intValue.toByte() + } + return bytes +} + +fun ByteArray.bytesToInts(startPosition: Int = 0, length: Int = this.size): IntArray { + val ints = IntArray(length) + val endPosition = startPosition + length + for (i in startPosition until endPosition) { + ints[i] = this[i].toInt() and 0xFF + } + return ints +} + +/** + * XOR two byte arrays together, and save result in originalArray + * + * @param keyArray this is XOR'd into the original array, repeats if necessary. + */ +fun ByteArray.xor(keyArray: ByteArray) { + var keyIndex = 0 + val keyLength = keyArray.size + for (i in this.indices) { + // XOR the data and start over if necessary + this[i] = (this[i].toInt() xor keyArray[keyIndex++ % keyLength].toInt()).toByte() + } +}