+
+// xor two arrays together for len items. The dst array contains the new xored values.
+void xor(unsigned char * dst, unsigned char * src, size_t len) {
+ for( ; len > 0; len--,dst++,src++)
+ *dst ^= *src;
+}
+
+int32_t le24toh (uint8_t data[3]) {
+ return (data[2] << 16) | (data[1] << 8) | data[0];
+}
+uint32_t le32toh (uint8_t *data) {
+ return (uint32_t)( (data[3]<<24) | (data[2]<<16) | (data[1]<<8) | data[0]);
+}
+// Pack a bitarray into a uint32_t.
+uint32_t PackBits(uint8_t start, uint8_t len, uint8_t* bits) {
+
+ if (len > 32) return 0;
+
+ int i = start;
+ int j = len-1;
+ uint32_t tmp = 0;
+
+ for (; j >= 0; --j, ++i)
+ tmp |= bits[i] << j;
+
+ return tmp;
+}
+
+// RotateLeft - Ultralight, Desfire, works on byte level
+// 00-01-02 >> 01-02-00
+void rol(uint8_t *data, const size_t len){
+ uint8_t first = data[0];
+ for (size_t i = 0; i < len-1; i++) {
+ data[i] = data[i+1];
+ }
+ data[len-1] = first;
+}
+
+// Swap bit order on a uint32_t value. Can be limited by nrbits just use say 8bits reversal
+uint32_t SwapBits(uint32_t value, int nrbits) {
+ uint32_t newvalue = 0;
+ for(int i = 0; i < nrbits; i++) {
+ newvalue ^= ((value >> i) & 1) << (nrbits - 1 - i);
+ }
+ return newvalue;
+}
\ No newline at end of file