110 Achegas 543162b701 ... 671f422a73

Autor SHA1 Mensaxe Data
  Martin-P 671f422a73 Merge SourceForge SVN repository, OpenV2G 0.9.5 %!s(int64=3) %!d(string=hai) anos
  daniel_peintner 87591ab3b7 docs: fix copyright year %!s(int64=3) %!d(string=hai) anos
  daniel_peintner 100123c809 docs: update release notes for 0.9.5 %!s(int64=3) %!d(string=hai) anos
  daniel_peintner 9bb3ff36d1 fix: possible memory corruption bug when parsing X509 serial numbers %!s(int64=3) %!d(string=hai) anos
  daniel_peintner 6a5f291f88 feat: add "iso2" prefix to Document and Fragment structures/defines to avoid collisions if multiple codecs are used in parallel (e.g., iso1 and iso2) %!s(int64=6) %!d(string=hai) anos
  daniel_peintner 7528fd8eb7 feat: add "din" prefix to Document and Fragment structures/defines to avoid collisions if multiple codecs are used in parallel (e.g., din and iso) %!s(int64=6) %!d(string=hai) anos
  daniel_peintner 7aa0d3151f feat: add "iso1" prefix to Document and Fragment structures/defines to avoid collisions if multiple codecs are used in parallel (e.g., din and iso) %!s(int64=6) %!d(string=hai) anos
  daniel_peintner 912aa5f2db remove unnecessary characters variable %!s(int64=6) %!d(string=hai) anos
  daniel_peintner 06a3b436bf fix: set fixed size of big integer container %!s(int64=7) %!d(string=hai) anos
  daniel_peintner 033a46dd37 fix: add support for big integer (see X509SerialNumber in ISO1) %!s(int64=7) %!d(string=hai) anos
  daniel_peintner 247f4647cf get read for release 0.9.4 %!s(int64=7) %!d(string=hai) anos
  daniel_peintner b47721107e fix eMAID fragment encoding/decoding (issue reported in https://sourceforge.net/p/openv2g/tickets/11/) %!s(int64=8) %!d(string=hai) anos
  daniel_peintner 09b9aedd33 extend coders with support of collapsing (same) fragment elements IF type is the same or is an extension (see https://sourceforge.net/p/openv2g/tickets/11/) %!s(int64=8) %!d(string=hai) anos
  daniel_peintner e3d4b29932 adapt limits as suggested in https://sourceforge.net/p/openv2g/tickets/8/ for DIN and ISO2 also %!s(int64=8) %!d(string=hai) anos
  daniel_peintner 63b3a15000 fix V2GTP header length from 16 to 32 bits as suggested in https://sourceforge.net/p/openv2g/tickets/10/ %!s(int64=8) %!d(string=hai) anos
  daniel_peintner e3a6bb5abc adapt static array sizes and information as suggested in https://sourceforge.net/p/openv2g/tickets/8/ %!s(int64=8) %!d(string=hai) anos
  daniel_peintner 90976ee871 fix some more #define issues as reported in https://sourceforge.net/p/openv2g/tickets/7/ %!s(int64=8) %!d(string=hai) anos
  daniel_peintner a4f803bb10 fix issue w.r.t. "warning: its scope is only this definition or declaration, which is probably not what you want %!s(int64=8) %!d(string=hai) anos
  daniel_peintner c6c656a9f7 fix issue with #defines pointing to wrong ISO version (ISO2 instead of ISO1) %!s(int64=8) %!d(string=hai) anos
  daniel_peintner 3fbc8ec397 fix issue https://sourceforge.net/p/openv2g/tickets/6/ %!s(int64=8) %!d(string=hai) anos
  daniel_peintner a671b75778 enum fix %!s(int64=8) %!d(string=hai) anos
  daniel_peintner 3d6ad81223 * restructure project to support multiple ISO versions %!s(int64=8) %!d(string=hai) anos
  daniel_peintner 9dde0a7b3d * initial check-in for 15118:2:2016 %!s(int64=8) %!d(string=hai) anos
  daniel_peintner 6cef435279 fix for ticket, https://sourceforge.net/p/openv2g/tickets/4/ %!s(int64=10) %!d(string=hai) anos
  daniel_peintner c013f04b1e * get ready for version 0.9.3 %!s(int64=10) %!d(string=hai) anos
  daniel_peintner c13885cbaf * get ready for release OpenV2G 0.9.2 %!s(int64=11) %!d(string=hai) anos
  daniel_peintner de61f0e59c * get ready for release 0.9.1 %!s(int64=11) %!d(string=hai) anos
  daniel_peintner 6ab917be66 * adds support for DIN %!s(int64=11) %!d(string=hai) anos
  daniel_peintner 9c2b711d55 * adds support for DIN %!s(int64=11) %!d(string=hai) anos
  daniel_peintner fafba1ecd0 * switch off pedantic warnings %!s(int64=11) %!d(string=hai) anos
  daniel_peintner c3dab49523 * get ready for release 0.9 %!s(int64=11) %!d(string=hai) anos
  sebastiankb 7814569390 OpenV2G 0.8 %!s(int64=11) %!d(string=hai) anos
  sebastiankb 85cb922c5a delete OpenV2G 0.7 %!s(int64=11) %!d(string=hai) anos
  daniel_peintner 0933696169 %!s(int64=12) %!d(string=hai) anos
  sebastiankb 7d969a0d4c update makefiles %!s(int64=13) %!d(string=hai) anos
  sebastiankb 4f6778feba update makefiles %!s(int64=13) %!d(string=hai) anos
  sebastiankb 71d00ba477 %!s(int64=13) %!d(string=hai) anos
  sebastiankb c7365f25a1 %!s(int64=13) %!d(string=hai) anos
  daniel_peintner 75c2627f62 %!s(int64=13) %!d(string=hai) anos
  sebastiankb 97e9cc9f3b v2gv2gtp for 0.7 %!s(int64=13) %!d(string=hai) anos
  sebastiankb 57ff27930c service files for 0.7 %!s(int64=13) %!d(string=hai) anos
  sebastiankb 732d394324 OpenV2G 0.7 init %!s(int64=13) %!d(string=hai) anos
  sebastiankb c4fcca04a4 %!s(int64=13) %!d(string=hai) anos
  sebastiankb a342317852 %!s(int64=13) %!d(string=hai) anos
  sebastiankb 5f4543c0de %!s(int64=13) %!d(string=hai) anos
  sebastiankb cfdd726f75 %!s(int64=13) %!d(string=hai) anos
  sebastiankb 99a33ccd91 main files %!s(int64=13) %!d(string=hai) anos
  daniel_peintner ddb210805a * last EXI codec fixes for release %!s(int64=13) %!d(string=hai) anos
  sebastiankb 38fde489ed init OpenV2G 0.6 public %!s(int64=13) %!d(string=hai) anos
  sebastiankb d3fe513ffc delete 0.6rc1 %!s(int64=13) %!d(string=hai) anos
  daniel_peintner 37d784f56c %!s(int64=14) %!d(string=hai) anos
  daniel_peintner 5a9aae1694 %!s(int64=14) %!d(string=hai) anos
  daniel_peintner 5dfebf8b48 %!s(int64=14) %!d(string=hai) anos
  daniel_peintner 38ab77c7d2 %!s(int64=14) %!d(string=hai) anos
  daniel_peintner e0a30233ba %!s(int64=14) %!d(string=hai) anos
  daniel_peintner 80b846a8b7 %!s(int64=14) %!d(string=hai) anos
  daniel_peintner 5ec7db1987 %!s(int64=14) %!d(string=hai) anos
  sebastiankb 31f84795e0 init the AppProtocolReq structure %!s(int64=14) %!d(string=hai) anos
  sebastiankb 4bb21254f9 %!s(int64=14) %!d(string=hai) anos
  daniel_peintner e8ba2a611c * fixes name table entries issue %!s(int64=14) %!d(string=hai) anos
  sebastiankb 32078408b5 codec update %!s(int64=14) %!d(string=hai) anos
  sebastiankb c9210283c7 %!s(int64=14) %!d(string=hai) anos
  sebastiankb d5f9a67a36 OOpenV2G 0.6 init2 %!s(int64=14) %!d(string=hai) anos
  sebastiankb ff85c0c60d OpenV2G 0.6 init %!s(int64=14) %!d(string=hai) anos
  sebastiankb 3e7b97d740 delete 0.5 %!s(int64=14) %!d(string=hai) anos
  sebastiankb 3d3a117445 %!s(int64=14) %!d(string=hai) anos
  daniel_peintner 4e17bb8f29 * update EXI codec to latest given schema %!s(int64=14) %!d(string=hai) anos
  daniel_peintner 87d09c6ae5 * update EXI codec to latest given schema %!s(int64=14) %!d(string=hai) anos
  daniel_peintner 2b978cbcd2 * update EXI codec to latest given schema %!s(int64=14) %!d(string=hai) anos
  daniel_peintner 4e01b87700 * update EXI codec to latest given schema %!s(int64=14) %!d(string=hai) anos
  daniel_peintner 40a2516afe * update EXI codec to latest given schema %!s(int64=14) %!d(string=hai) anos
  sebastiankb 737e0a1141 %!s(int64=14) %!d(string=hai) anos
  sebastiankb 9ab7ff6d40 %!s(int64=14) %!d(string=hai) anos
  sebastiankb 6b4c83aa45 OpeOpenV2G 0.5 init %!s(int64=14) %!d(string=hai) anos
  sebastiankb 8849f662b5 delete old files (DoIP and main_service, main_service, etc) %!s(int64=14) %!d(string=hai) anos
  daniel_peintner 7799eeb24a * new exi and xml files according to latest XML Schema %!s(int64=14) %!d(string=hai) anos
  sebastiankb 098db4604e release 0.4 (DC charging) %!s(int64=14) %!d(string=hai) anos
  sebastiankb d9a8576ec0 0.3.1 release (DoIP) %!s(int64=15) %!d(string=hai) anos
  sebastiankb f17cd9c1b5 %!s(int64=15) %!d(string=hai) anos
  sebastiankb 7f2adb89ed 0.3.1 release (test) %!s(int64=15) %!d(string=hai) anos
  sebastiankb 138bdd4ae6 %!s(int64=15) %!d(string=hai) anos
  sebastiankb 19d0d4c9b4 0.3.1 release (V2G service) %!s(int64=15) %!d(string=hai) anos
  sebastiankb cbdba43af3 %!s(int64=15) %!d(string=hai) anos
  sebastiankb 05301bf248 0.3.1 release (EXI codec) %!s(int64=15) %!d(string=hai) anos
  sebastiankb e1e0b55598 %!s(int64=15) %!d(string=hai) anos
  sebastiankb 3b16a44a99 %!s(int64=15) %!d(string=hai) anos
  sebastiankb be0560db7a %!s(int64=15) %!d(string=hai) anos
  sebastiankb 1f047aeb7f doip.h --> doIP.h in v2g_serviceClientDataTransmitter.c %!s(int64=15) %!d(string=hai) anos
  sebastiankb a7e1ab57dd doip files %!s(int64=15) %!d(string=hai) anos
  sebastiankb 12bd32bd8a 0.3 release zum testen %!s(int64=15) %!d(string=hai) anos
  mlauterbach 3e4a8426d8 - changed Tool Chain Editor from 'MinGW GCC' to 'Linux GCC' %!s(int64=15) %!d(string=hai) anos
  mlauterbach 350a915582 removed warnings: defined 1bit wide bitfields to 'unsigned int' %!s(int64=15) %!d(string=hai) anos
  sebastiankb fa292b984e ByteStream included %!s(int64=15) %!d(string=hai) anos
  sebastiankb 32f7bfd532 - version 0.2.3 or 0.3? %!s(int64=15) %!d(string=hai) anos
  sebastiankb 331e3ecbb1 - service 0.2.2 %!s(int64=15) %!d(string=hai) anos
  daniel_peintner 69e25e0172 * improves EXI codec footprint %!s(int64=15) %!d(string=hai) anos
  sebastiankb a9e47e19ae - readme version changes %!s(int64=15) %!d(string=hai) anos
  sebastiankb 164bc87bbd - tag release 0.2.1 %!s(int64=15) %!d(string=hai) anos
  sebastiankb f4b76996a2 - changed .cproject to release compile mode %!s(int64=15) %!d(string=hai) anos
  sebastiankb 6f93ebba75 %!s(int64=15) %!d(string=hai) anos
  sebastiankb d666c476c1 - include loop handling in serialization and datatype init %!s(int64=15) %!d(string=hai) anos
  daniel_peintner 69ef78539d * adds service (server & client) %!s(int64=15) %!d(string=hai) anos
  sebastiankb 102e607847 readme to 0.2 %!s(int64=15) %!d(string=hai) anos
  sebastiankb 4e1d48bb78 versionierung im codec auf 0.2 %!s(int64=15) %!d(string=hai) anos
  sebastiankb b132e921e5 - service implementation %!s(int64=15) %!d(string=hai) anos
  daniel_peintner 7289406799 * split EXI Header in decoder and encoder part %!s(int64=15) %!d(string=hai) anos
  daniel_peintner e42f201089 * eliminates remaining -ansic -pedantic warnings %!s(int64=15) %!d(string=hai) anos
  daniel_peintner 8f499da64a * adds README.txt %!s(int64=15) %!d(string=hai) anos
  daniel_peintner 9a9835ad3d * first code check-in (support for EXI stream) %!s(int64=15) %!d(string=hai) anos
  daniel_peintner 5f032498c0 * setup initial SVN structure %!s(int64=15) %!d(string=hai) anos
Modificáronse 2 ficheiros con 390 adicións e 248 borrados
  1. 6 2
      README.txt
  2. 384 246
      src/codec/DecoderChannel.c

+ 6 - 2
README.txt

@@ -1,12 +1,12 @@
 -------------------------------------------------------------------------
 OpenV2G - an open source project implementing the basic functionality of the ISO IEC 15118 vehicle to grid (V2G) communication interface 
-Version 0.9.4, released January 30, 2018
+Version 0.9.5, released March 11, 2022
 http://openv2g.sourceforge.net/
 
 Please report bugs via the SourceForge bug tracking system at http://sourceforge.net/tracker/?group_id=350113.
 Thank you.
 
-Copyright (C) 2007-2018 Siemens AG
+Copyright (C) 2007-2022 Siemens AG
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published
@@ -21,6 +21,10 @@ GNU Lesser General Public License for more details.
 You should have received a copy of the GNU Lesser General Public License
 along with this program. If not, see <http://www.gnu.org/licenses/>.
 
+-------------------------------------------------------------------------
+CHANGES from version 0.9.4:
+-------------------------------------------------------------------------
+* fix possible memory corruption bug
 
 -------------------------------------------------------------------------
 CHANGES from version 0.9.3:

+ 384 - 246
src/codec/DecoderChannel.c

@@ -1,32 +1,32 @@
-/*
- * Copyright (C) 2007-2018 Siemens AG
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/*******************************************************************
- *
- * @author Daniel.Peintner.EXT@siemens.com
- * @version 2017-03-02 
- * @contact Richard.Kuntschke@siemens.com
- *
- * <p>Code generated by EXIdizer</p>
- * <p>Schema: V2G_CI_MsgDef.xsd</p>
- *
- *
- ********************************************************************/
-
+/*
+ * Copyright (C) 2007-2022 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 2022-03-08 
+ * @contact Richard.Kuntschke@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ * <p>Schema: V2G_CI_MsgDef.xsd</p>
+ *
+ *
+ ********************************************************************/
+
 
 
 #include "DecoderChannel.h"
@@ -261,182 +261,320 @@ int decodeUnsignedInteger64(bitstream_t* stream, uint64_t* uint64) {
 
 	return errn;
 }
-
-
-void _reverseArray(uint8_t *array, int number) {
-    int x, t;
-    number--;
-
-    for(x = 0; x < number; x ++, number --) {
-        t = array[x];
-        array[x] = array[number];
-        array[number] = t;
-    }
-}
-
-/**
- * Decode an arbitrary precision non negative integer using a sequence of
- * octets. The most significant bit of the last octet is set to zero to
- * indicate sequence termination. Only seven bits per octet are used to
- * store the integer's value.
- */
-int decodeUnsignedIntegerBig(bitstream_t* stream, size_t size, uint8_t* data, size_t* len) {
-	int errn = 0;
-	uint8_t b = 0;
-	unsigned int mShift1 = 0;
-	unsigned int mShift2 = 0;
-	unsigned int mShift3 = 0;
-	unsigned int mShift4 = 0;
-	unsigned int nBytesRead = 0;
-	unsigned int nBitsAvailable = 0;
-	uint64_t uint64_1 = 0;
-	uint64_t uint64_2 = 0;
-	uint64_t uint64_3 = 0;
-	uint64_t uint64_4 = 0;
-
-	*len = 0;
-
-	do {
-		errn = decode(stream, &b);
-		nBytesRead++;
-		nBitsAvailable += 7;
-
-		if(nBytesRead <= 8) {
-			uint64_1 += ((uint64_t) (b & 127)) << mShift1;
-			mShift1 += 7;
-		} else if(nBytesRead <= 16) {
-			uint64_2 += ((uint64_t) (b & 127)) << mShift2;
-			mShift2 += 7;
-		} else if(nBytesRead <= 24) {
-			uint64_3 += ((uint64_t) (b & 127)) << mShift3;
-			mShift3 += 7;
-		} else if(nBytesRead <= 32) {
-			uint64_4 += ((uint64_t) (b & 127)) << mShift4;
-			mShift4 += 7;
-		} else {
-			return -1; // too large
-		}
-	} while (errn == 0 && (b >> 7) == 1);
-
-	// shift actual data into array
-	if(uint64_4 != 0) {
-		// 7 octets for uint64_1
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 1
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 2
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 3
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 4
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 5
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 6
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 7
-
-		// 7 octets for uint64_2
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 1
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 2
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 3
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 4
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 5
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 6
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 7
-
-		// 7 octets for uint64_3
-		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 1
-		uint64_3 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 2
-		uint64_3 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 3
-		uint64_3 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 4
-		uint64_3 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 5
-		uint64_3 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 6
-		uint64_3 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 7
-
-		// remaining octets of uint64_4
-		while (uint64_4 != 0 && errn == 0) {
-			data[(*len)++] = uint64_4 & 0xFF;
-			uint64_4 >>= 8;
-		}
-	} else if(uint64_3 != 0) {
-		// 7 octets for uint64_1
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 1
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 2
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 3
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 4
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 5
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 6
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 7
-
-		// 7 octets for uint64_2
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 1
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 2
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 3
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 4
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 5
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 6
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 7
-
-		// remaining octets of uint64_3
-		while (uint64_3 != 0 && errn == 0) {
-			data[(*len)++] = uint64_3 & 0xFF;
-			uint64_3 >>= 8;
-		}
-
-	} else if(uint64_2 != 0) {
-		// 7 octets for uint64_1
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 1
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 2
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 3
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 4
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 5
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 6
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 7
-		// remaining octets of uint64_2
-		while (uint64_2 != 0 && errn == 0) {
-			data[(*len)++] = uint64_2 & 0xFF;
-			uint64_2 >>= 8;
-		}
-	} else if(uint64_1 != 0) {
-		while (uint64_1 != 0 && errn == 0) {
-			data[(*len)++] = uint64_1 & 0xFF;
-			uint64_1 >>= 8;
-		}
-	}
-
-	_reverseArray(data, *len);
-
-	return errn;
+
+
+void _reverseArray(uint8_t *array, int number) {
+    int x, t;
+    number--;
+
+    for(x = 0; x < number; x ++, number --) {
+        t = array[x];
+        array[x] = array[number];
+        array[number] = t;
+    }
+}
+
+/**
+ * Decode an arbitrary precision non negative integer using a sequence of
+ * octets. The most significant bit of the last octet is set to zero to
+ * indicate sequence termination. Only seven bits per octet are used to
+ * store the integer's value.
+ */
+int decodeUnsignedIntegerBig(bitstream_t* stream, size_t size, uint8_t* data, size_t* len) {
+	int errn = 0;
+	uint8_t b = 0;
+	unsigned int mShift1 = 0;
+	unsigned int mShift2 = 0;
+	unsigned int mShift3 = 0;
+	unsigned int mShift4 = 0;
+	unsigned int nBytesRead = 0;
+	unsigned int nBitsAvailable = 0;
+	uint64_t uint64_1 = 0;
+	uint64_t uint64_2 = 0;
+	uint64_t uint64_3 = 0;
+	uint64_t uint64_4 = 0;
+
+	*len = 0;
+
+	do {
+		errn = decode(stream, &b);
+		nBytesRead++;
+		nBitsAvailable += 7;
+
+		if(nBytesRead <= 8) {
+			uint64_1 += ((uint64_t) (b & 127)) << mShift1;
+			mShift1 += 7;
+		} else if(nBytesRead <= 16) {
+			uint64_2 += ((uint64_t) (b & 127)) << mShift2;
+			mShift2 += 7;
+		} else if(nBytesRead <= 24) {
+			uint64_3 += ((uint64_t) (b & 127)) << mShift3;
+			mShift3 += 7;
+		} else if(nBytesRead <= 32) {
+			uint64_4 += ((uint64_t) (b & 127)) << mShift4;
+			mShift4 += 7;
+		} else {
+			return -1; /* too large */
+		}
+	} while (errn == 0 && (b >> 7) == 1);
+
+	/* shift actual data into array */
+	if(uint64_4 != 0) {
+		/* 7 octets for uint64_1 */
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 1 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 2 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 3 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 4 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 5 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 6 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 7 */
+
+		/* 7 octets for uint64_2 */
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 1 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 2 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 3 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 4 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 5 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 6 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 7 */
+
+		/* 7 octets for uint64_3 */
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); /* 1 */
+		uint64_3 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); /* 2 */
+		uint64_3 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); /* 3 */
+		uint64_3 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); /* 4 */
+		uint64_3 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); /* 5 */
+		uint64_3 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); /* 6 */
+		uint64_3 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); /* 7 */
+
+		/* remaining octets of uint64_4 */
+		while (uint64_4 != 0 && errn == 0) {
+			if(*len >= size) {
+				return EXI_ERROR_OUT_OF_BOUNDS;
+			}
+			data[(*len)++] = uint64_4 & 0xFF;
+			uint64_4 >>= 8;
+		}
+	} else if(uint64_3 != 0) {
+		/* 7 octets for uint64_1 */
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 1 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 2 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 3 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 4 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 5 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 6 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 7 */
+
+		/* 7 octets for uint64_2 */
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 1 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 2 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 3 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 4 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 5 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 6 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 7 */
+
+		/* remaining octets of uint64_3 */
+		while (uint64_3 != 0 && errn == 0) {
+			if(*len >= size) {
+				return EXI_ERROR_OUT_OF_BOUNDS;
+			}
+			data[(*len)++] = uint64_3 & 0xFF;
+			uint64_3 >>= 8;
+		}
+
+	} else if(uint64_2 != 0) {
+		/* 7 octets for uint64_1 */
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 1 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 2 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 3 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 4 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 5 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 6 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 7 */
+		/* remaining octets of uint64_2 */
+		while (uint64_2 != 0 && errn == 0) {
+			if(*len >= size) {
+				return EXI_ERROR_OUT_OF_BOUNDS;
+			}
+			data[(*len)++] = uint64_2 & 0xFF;
+			uint64_2 >>= 8;
+		}
+	} else if(uint64_1 != 0) {
+		while (uint64_1 != 0 && errn == 0) {
+			if(*len >= size) {
+				return EXI_ERROR_OUT_OF_BOUNDS;
+			}
+			data[(*len)++] = uint64_1 & 0xFF;
+			uint64_1 >>= 8;
+		}
+	}
+
+	_reverseArray(data, *len);
+
+	return errn;
 }
 
 int decodeInteger(bitstream_t* stream, exi_integer_t* iv) {
@@ -529,28 +667,28 @@ int decodeInteger64(bitstream_t* stream, int64_t* int64) {
 	}
 
 	return errn;
-}
-
-/**
- * Decode an arbitrary precision integer using a sign bit followed by a
- * sequence of octets. The most significant bit of the last octet is set to
- * zero to indicate sequence termination. Only seven bits per octet are used
- * to store the integer's value.
- */
-int decodeIntegerBig(bitstream_t* stream, int* negative, size_t size, uint8_t* data, size_t* len) {
-	int errn = decodeBoolean(stream, negative);
-
-	if (errn == 0) {
-		if (*negative) {
-			/* For negative values, the Unsigned Integer holds the
-			 * magnitude of the value minus 1 */
-		} else {
-			/* positive */
-		}
-		errn = decodeUnsignedIntegerBig(stream, size, data, len);
-	}
-
-	return errn;
+}
+
+/**
+ * Decode an arbitrary precision integer using a sign bit followed by a
+ * sequence of octets. The most significant bit of the last octet is set to
+ * zero to indicate sequence termination. Only seven bits per octet are used
+ * to store the integer's value.
+ */
+int decodeIntegerBig(bitstream_t* stream, int* negative, size_t size, uint8_t* data, size_t* len) {
+	int errn = decodeBoolean(stream, negative);
+
+	if (errn == 0) {
+		if (*negative) {
+			/* For negative values, the Unsigned Integer holds the
+			 * magnitude of the value minus 1 */
+		} else {
+			/* positive */
+		}
+		errn = decodeUnsignedIntegerBig(stream, size, data, len);
+	}
+
+	return errn;
 }
 
 /**
@@ -637,16 +775,16 @@ int decodeString(bitstream_t* stream, exi_string_t* s) {
  */
 int decodeCharacters(bitstream_t* stream, size_t len, exi_string_character_t* chars, size_t charsSize) {
 	unsigned int i;
-	int errn = 0;
-
-	unsigned int extraChar = 0;
-#if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
-	extraChar = 1; /* null terminator */
-#endif /* STRING_REPRESENTATION_ASCII */
-
-	if ( (len + extraChar) > charsSize) {
-		errn = EXI_ERROR_OUT_OF_STRING_BUFFER;
-		return errn;
+	int errn = 0;
+
+	unsigned int extraChar = 0;
+#if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
+	extraChar = 1; /* null terminator */
+#endif /* STRING_REPRESENTATION_ASCII */
+
+	if ( (len + extraChar) > charsSize) {
+		errn = EXI_ERROR_OUT_OF_STRING_BUFFER;
+		return errn;
 	}
 
 #if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
@@ -679,15 +817,15 @@ int decodeRCSCharacters(bitstream_t* stream, size_t len, exi_string_character_t*
 	unsigned int i;
 	int errn = 0;
 	uint32_t uint32;
-	unsigned int extraChar = 0;
-#if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
-	uint8_t b;
-	extraChar = 1; /* null terminator */
-#endif /* STRING_REPRESENTATION_ASCII */
-
-	if ( (len + extraChar) > charsSize) {
-		errn = EXI_ERROR_OUT_OF_STRING_BUFFER;
-		return errn;
+	unsigned int extraChar = 0;
+#if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
+	uint8_t b;
+	extraChar = 1; /* null terminator */
+#endif /* STRING_REPRESENTATION_ASCII */
+
+	if ( (len + extraChar) > charsSize) {
+		errn = EXI_ERROR_OUT_OF_STRING_BUFFER;
+		return errn;
 	}