src/types/IntegerDataTypeReader.h
branchv_0
changeset 52 d22e9274fcad
parent 46 12c329f5524f
equal deleted inserted replaced
51:a42e6992897c 52:d22e9274fcad
    54 
    54 
    55 	IntegerDataTypeReader() : DataTypeReader<integer_t>(TypeId::INTEGER, DATA_TYPE_CODE_INTEGER) {
    55 	IntegerDataTypeReader() : DataTypeReader<integer_t>(TypeId::INTEGER, DATA_TYPE_CODE_INTEGER) {
    56 	}
    56 	}
    57 
    57 
    58 	integer_t readValue(std::istream &input) override {
    58 	integer_t readValue(std::istream &input) override {
       
    59 		static const integer_t ZERO = 0;
    59 		integer_t value = 0;
    60 		integer_t value = 0;
    60 		integer_t shift = 0;
    61 		integer_t shift = 0;
    61 		octet_t octet;
    62 		octet_t octet;
    62 		do {
    63 		do {
    63 			octet = readNextOctet(input);
    64 			octet = readNextOctet(input);
    64 			value += integer_t(octet & 0x7F) << shift;
    65 			value += integer_t(octet & 0x7F) << shift;
    65 			shift += 7;
    66 			shift += 7;
    66 		} while (octet >= 128);
    67 		} while (octet >= 128);
    67 
    68 
    68 		if ((shift < (sizeof (integer_t) * 8)) && (octet & 0x40))
    69 		if ((shift < (sizeof (integer_t) * 8)) && (octet & 0x40))
    69 			value |= (~0 << shift);
    70 			value |= (~ZERO << shift);
    70 		return value;
    71 		return value;
    71 	}
    72 	}
    72 
    73 
    73 	string_t toString(const integer_t &value) override {
    74 	string_t toString(const integer_t &value) override {
    74 		return std::to_wstring(value);
    75 		return std::to_wstring(value);