summaryrefslogtreecommitdiffstats
path: root/code/utility.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'code/utility.cpp')
-rw-r--r--code/utility.cpp66
1 files changed, 66 insertions, 0 deletions
diff --git a/code/utility.cpp b/code/utility.cpp
new file mode 100644
index 0000000..aa50e9f
--- /dev/null
+++ b/code/utility.cpp
@@ -0,0 +1,66 @@
+#include "utility.h"
+
+int VarIntRead(unsigned char *data, size_t &readed) {
+ readed = 0;
+ int result = 0;
+ char read;
+ do {
+ read = data[readed];
+ int value = (read & 0b01111111);
+ result |= (value << (7 * readed));
+
+ readed++;
+ if (readed > 5) {
+ throw "VarInt is too big";
+ }
+ } while ((read & 0b10000000) != 0);
+
+ return result;
+}
+
+size_t VarIntWrite(unsigned int value, unsigned char *data) {
+ size_t len = 0;
+ do {
+ unsigned char temp = (unsigned char) (value & 0b01111111);
+ value >>= 7;
+ if (value != 0) {
+ temp |= 0b10000000;
+ }
+ data[len] = temp;
+ len++;
+ } while (value != 0);
+ return len;
+}
+
+long long int ReadVarLong(unsigned char *data, int &readed) {
+ readed = 0;
+ long long result = 0;
+ unsigned char read;
+ do {
+ read = data[readed];
+ long long value = (read & 0b01111111);
+ result |= (value << (7 * readed));
+
+ readed++;
+ if (readed > 10) {
+ throw "VarLong is too big";
+ }
+ } while ((read & 0b10000000) != 0);
+ return result;
+}
+
+unsigned char *WriteVarLong(unsigned long long int value, int &len) {
+ unsigned char *data = new unsigned char[10];
+ len = 0;
+ do {
+ unsigned char temp = (unsigned char) (value & 0b01111111);
+ value >>= 7;
+ if (value != 0) {
+ temp |= 0b10000000;
+ }
+ data[len] = temp;
+ len++;
+ } while (value != 0);
+
+ return data;
+} \ No newline at end of file