util.cpp 3.76 KB
#include "util.h"

namespace utils {

    void Util::stringUpper(string& string) {
        transform(string.begin(), string.end(), string.begin(), toupper);
    }

    string Util::int2str(int n) {
        std::stringstream ss;

        ss << n;
        return ss.str();
    }

    int Util::stringtoint(const char* string) {
        return atoi(string);
    }

     /* 
         -- get bits out of buffer (max 32 bit!!!)
         -- return: value
     */

    unsigned long long Util::getBits(unsigned char* buf, int byte_offset, int startbit, int bitlen) {
        unsigned char *b;
        unsigned long v;
        unsigned long mask;
        unsigned long tmp_long;
        int bitHigh;


        b = &buf[byte_offset + (startbit >> 3)];
        startbit %= 8;

        switch ((bitlen - 1) >> 3) {
            case -1 : // -- <=0 bits: always 0
                return 0L;
                break;

            case 0: // -- 1..8 bit
                tmp_long = (unsigned long) (
                        (*(b) << 8) + *(b + 1));
                bitHigh = 16;
                break;

            case 1: // -- 9..16 bit
                tmp_long = (unsigned long) (
                        (*(b) << 16) + (*(b + 1) << 8) + *(b + 2));
                bitHigh = 24;
                break;

            case 2: // -- 17..24 bit
                tmp_long = (unsigned long) (
                        (*(b) << 24) + (*(b + 1) << 16) +
                        (*(b + 2) << 8) + *(b + 3));
                bitHigh = 32;
                break;

            case 3: // -- 25..32 bit
                // -- to be safe, we need 32+8 bit as shift range 
                return (unsigned long) Util::getBits48(b, 0, startbit, bitlen);
                break;

            default: // -- 33.. bits: fail, deliver constant fail value
                //printf("\nGET BITS: OUT OF BOUNDS\n");
                return getBits48(buf, byte_offset, startbit, bitlen);
                break;
        }

        startbit = bitHigh - startbit - bitlen;
        tmp_long = tmp_long >> startbit;
        mask = (1ULL << bitlen) - 1; // 1ULL !!!
        v = tmp_long & mask;

        return v;
    }

    /*
      -- get bits out of buffer  (max 48 bit)
      -- extended bitrange, so it's slower
      -- return: value
     */

    long long Util::getBits48(unsigned char *buf, int byte_offset, int startbit, int bitlen) {
        unsigned char *b;
        unsigned long long v;
        unsigned long long mask;
        unsigned long long tmp;

        if (bitlen > 48) {
            printf("\ngetBits48() OUT OF BOUNDS\n");
            return getBits64(buf, byte_offset, startbit, bitlen);
        }


        b = &buf[byte_offset + (startbit / 8)];
        startbit %= 8;


        // -- safe is 48 bitlen
        tmp = (unsigned long long) (
                ((unsigned long long) *(b) << 48) + ((unsigned long long) *(b + 1) << 40) +
                ((unsigned long long) *(b + 2) << 32) + ((unsigned long long) *(b + 3) << 24) +
                (*(b + 4) << 16) + (*(b + 5) << 8) + *(b + 6));

        startbit = 56 - startbit - bitlen;
        tmp = tmp >> startbit;
        mask = (1ULL << bitlen) - 1; // 1ULL !!!
        v = tmp & mask;

        return v;
    }

    /*
      -- get bits out of buffer   (max 64 bit)
      -- extended bitrange, so it's slower 
      -- return: value
     */

    unsigned long long Util::getBits64(unsigned char *buf, int byte_offset, int startbit, int bitlen) {
        unsigned long long x1, x2, x3;

        if (bitlen <= 32) {
            x3 = Util::getBits(buf, byte_offset, startbit, bitlen);
        } else {
            x1 = Util::getBits(buf, byte_offset, startbit, 32);
            x2 = Util::getBits(buf, byte_offset, startbit + 32, bitlen - 32);
            x3 = (x1 << (bitlen - 32)) + x2;
        }
        return x3;
    }

}