110 Commits 543162b701 ... 671f422a73

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