10000 Added initial source code · TeskeVirtualSystem/struct.js@a860968 · GitHub
[go: up one dir, main page]

Skip to content

Commit a860968

Browse files
committed
Added initial source code
1 parent 15721a2 commit a860968

File tree

2 files changed

+422
-0
lines changed

2 files changed

+422
-0
lines changed

src/struct.js

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
/*
2+
_ _ _
3+
___| |_ _ __ _ _ ___| |_ (_)___
4+
/ __| __| '__| | | |/ __| __| | / __|
5+
\__ \ |_| | | |_| | (__| |_ _ | \__ \
6+
|___/\__|_| \__,_|\___|\__(_)/ |___/
7+
|__/
8+
9+
By: Lucas Teske
10+
https://github.com/racerxdl/struct.js
11+
For licensing read LICENSE at github
12+
13+
*/
14+
15+
var Struct = { "version" : 0.1, "showerrors":true, "shownotice" : true };
16+
17+
/* Enums */
18+
Struct.LittleEndian = 0;
19+
Struct.BigEndian = 1;
20+
21+
/* Shift consts */
22+
Struct.b56 = Math.pow(2,56);
23+
Struct.b48 = Math.pow(2,48);
24+
Struct.b40 = Math.pow(2,40);
25+
Struct.b32 = Math.pow(2,32);
26+
Struct.b24 = Math.pow(2,24);
27+
Struct.b16 = Math.pow(2,16);
28+
Struct.b8 = Math.pow(2,8);
29+
Struct.b4 = Math.pow(2,4);
30+
31+
Struct.b = {}
32+
33+
for(var i=0;i<64;i++) {
34+
Struct.b[i] = Math.pow(2,i);
35+
}
36+
37+
38+
/* Main unpack function */
39+
Struct.unpack = function(mode, string) {
40+
var retval = [],
41+
strpos = 0,
42+
modepos = 0,
43+
strlen = string.length,
44+
modelen = mode.length,
45+
endianess;
46+
47+
if(modelen == 0) {
48+
Struct.error("Invalid mode");
49+
return undefined;
50+
}
51+
switch(mode[0]) {
52+
case ">":
53+
case "!": endianess = Struct.BigEndian; modepos += 1; break;
54+
55+
case "@":
56+
case "=": Struct.notice("Assuming native = littleendian"); modepos += 1;
57+
default: endianess = Struct.LittleEndian;
58+
}
59+
data = [0,0];
60+
while(modepos < modelen) {
61+
switch(mode[modepos]) {
62+
case "c": data[0] = string[strpos]; data[1] = 1; break;
63+
case "b": data = Struct.unpackchar(string, endianess, strpos, true); break;
64+
case "B": data = Struct.unpackchar(string, endianess, strpos, false); break;
65+
case "?": data = Struct.unpackbool(string, endianess, strpos); break;
66+
case "h": data = Struct.unpackshort(string,endianess, strpos, true); break;
67+
case "H": data = Struct.unpackshort(string,endianess, strpos, false); break;
68+
case "i": data = Struct.unpackint(string,endianess, strpos, true); break;
69+
case "I": data = Struct.unpackint(string,endianess, strpos, false); break;
70+
case "l": data = Struct.unpackint(string,endianess, strpos, true); break;
71+
case "L": data = Struct.unpackint(string,endianess, strpos, false); break;
72+
case "q": data = Struct.unpacklonglong(string, endianess, strpos, true); break;
73+
case "Q": data = Struct.unpacklonglong(string, endianess, strpos, false); break;
74+
case "f": data = Struct.unpackfloat(string,endianess,strpos); break;
75+
case "d": data = Struct.unpackdouble(string,endianess, strpos); break;
76+
case "s":
77+
case "p": data = Struct.unpackstring(string, strpos); break
78+
case "P": data = Struct.unpackint(string,endianess, strpos, false); break;
79+
case "x": data = [undefined, 1]; break;
80+
default : Struct.error("Invalid char at "+modepos+" : \""+mode[modepos]+"\""); retval = undefined; break;
81+
}
82+
if(data[0] !== undefined)
83+
retval.push(data[0]);
84+
strpos += data[1];
85+
modepos += 1;
86+
}
87+
88+
return retval;
89+
}
90+
91+
/* Unpack String */
92+
Struct.unpackstring = function(string, start) {
93+
var outstring = "", i = start;
94+
while(true) {
95+
if(string.charCodeAt(i) == 0)
96+
break;
97+
outstring += string[i];
98+
++i;
99+
}
100+
return outstring;
101+
};
102+
103+
/* Unpack Double */
104+
Struct.unpackdouble = function(string, endianess, start, signed) {
105+
var bytes = (endianess==Struct.LittleEndian) ?
106+
[ string.charCodeAt(start+7),string.charCodeAt(start+6),string.charCodeAt(start+5),string.charCodeAt(start+4),string.charCodeAt(start+3),string.charCodeAt(start+2),string.charCodeAt(start+1),string.charCodeAt(start+0) ] :
107+
[ string.charCodeAt(start+0),string.charCodeAt(start+1),string.charCodeAt(start+2),string.charCodeAt(start+3),string.charCodeAt(start+4),string.charCodeAt(start+5),string.charCodeAt(start+6),string.charCodeAt(start+7) ],
108+
sign = ((bytes[0] & 0x80) >> 7) > 0
109+
a = ((bytes[0] << 24) + (bytes[1] << 16) + (bytes[2] << 8) + bytes[3]) >>> 0,
110+
b = ((bytes[4] << 24) + (bytes[5] << 16) + (bytes[6] << 8) + bytes[7]) >>> 0,
111+
e = (a >> 52 - 32 & 0x7ff) - 1023,
112+
data = (a & 0xfffff | 0x100000) * 1.0/ Math.pow(2,52-32) * Math.pow(2, e) + b * 1.0 / Math.pow(2, 52) * Math.pow(2, e);
113+
return [ (sign) ? -data : data, 8 ];
114+
};
115+
116+
/* Unpack float */
117+
Struct.unpackfloat = function(string, endianess, start, signed) {
118+
var bytes = (endianess==Struct.LittleEndian) ?
119+
[ string.charCodeAt(start+3),string.charCodeAt(start+2),string.charCodeAt(start+1),string.charCodeAt(start+0) ] :
120+
[ string.charCodeAt(start+0),string.charCodeAt(start+1),string.charCodeAt(start+2),string.charCodeAt(start+3) ],
121+
sign = ((bytes[0] & 0x80) >> 7) > 0,
122+
a = ((bytes[0] << 24) + (bytes[1] << 16) + (bytes[2] << 8) + bytes[3]) >>> 0,
123+
data = (a & 0x7fffff | 0x800000) * 1.0 / Math.pow(2,23) * Math.pow(2, ((a>>23 & 0xff) - 127))
124+
return [ (sign) ? -data : data, 4 ];
125+
};
126+
127+
/* Unpack Signed/Unsigned Long Long */
128+
Struct.unpacklonglong = function(string, endianess, start, signed) {
129+
var retval = (endianess==Struct.LittleEndian) ?
130+
( string.charCodeAt(7+start) * Struct.b56 ) + ( string.charCodeAt(6+start) * Struct.b48 ) + ( string.charCodeAt(5+start) * Struct.b40 ) + ( string.charCodeAt(4+start) * Struct.b32 ) + ( string.charCodeAt(3+start) * Struct.b24 ) + ( string.charCodeAt(2+start) * Struct.b16 ) + ( string.charCodeAt(1+start) * Struct.b8 ) + ( string.charCodeAt(0+start) ) :
131+
( string.charCodeAt(0+start) * Struct.b56 ) + ( string.charCodeAt(1+start) * Struct.b48 ) + ( string.charCodeAt(2+start) * Struct.b40 ) + ( string.charCodeAt(3+start) * Struct.b32 ) + ( string.charCodeAt(4+start) * Struct.b24 ) + ( string.charCodeAt(5+start) * Struct.b16 ) + ( string.charCodeAt(6+start) * Struct.b8 ) + ( string.charCodeAt(7+start));
132+
retval = (signed & retval > 0x7FFFFFFFFFFFFFFF ) ? -( 0xFFFFFFFFFFFFFFFF - retval + 1 ) : retval ;
133+
return [retval, 8];
134+
};
135+
Struct.unpackint = function(string, endianess, start, signed) {
136+
var retval = (endianess==Struct.LittleEndian) ?
137+
( string.charCodeAt(3+start) * Struct.b24 ) + ( string.charCodeAt(2+start) * Struct.b16 ) + ( string.charCodeAt(1+start) * Struct.b8 ) + ( string.charCodeAt(0+start) ) :
138+
( string.charCodeAt(0+start) * Struct.b24 ) + ( string.charCodeAt(1+start) * Struct.b16 ) + ( string.charCodeAt(2+start) * Struct.b8 ) + ( string.charCodeAt(3+start) );
139+
retval = (signed && retval > 0x7FFFFFFF) ? -( 0xFFFFFFFF - retval + 1 ) : retval ;
140+
return [retval, 4];
141+
};
142+
143+
/* Unpack signed/unsigned short */
144+
Struct.unpackshort = function(string, endianess, start, signed) {
145+
var retval = (endianess==Struct.LittleEndian) ?
146+
( string.charCodeAt(1+start) * Struct.b8 ) + ( string.charCodeAt(0+start) ) :
147+
( string.charCodeAt(2+start) * Struct.b8 ) + ( string.charCodeAt(3+start) );
148+
retval = (signed & retval > 0x7FFF) ? -( 0xFFFF - retval + 1 ) : retval;
149+
return [retval, 2];
150+
}
151+
152+
/* Unpack signed/unsigned char as int */
153+
Struct.unpackchar = function(string, endianess, start, signed) {
154+
var retval = string.charCodeAt(start);
155+
retval = (signed & retval > 0x7F) ? - ( 0xFF - retval + 1 ) : retval;
156+
return [ retval , 1 ]
157+
};
158+
159+
/* Unpack boolean */
160+
Struct.unpackbool = function(string, endianess, strpos) {
161+
return [ string.charCodeAt(strpos) > 0, 1 ];
162+
};
163+
164+
Struct.pack = function(mode, data) {
165+
// TODO: Like the Struct.unpack, this will handle the mode and call individual packings
166+
};
167+
168+
Struct.packfloat = function(float, endianess) {
169+
/*
170+
A python algorithm, its crap I know. (Lucas)
171+
x = 12.375
172+
173+
inteiro = int(x)
174+
decimal = x - inteiro
175+
sign = 1 if (x < 0) else 0
176+
177+
bina = []
178+
179+
mant = decimal * 2
180+
while mant != 0:
181+
if mant >= 1:
182+
mant -= 1
183+
bina.append(1)
184+
else:
185+
bina.append(0)
186+
mant *= 2
187+
188+
binfloat = "%s.%s" %(bin(inteiro)[2:],("".join([ str(x) for x in bina ])))
189+
exp = binfloat.find(".") - 1 + 127
190+
s = len(binfloat.replace(".","")[1:])
191+
binfloat = int(binfloat.replace(".","")[1:],2)
192+
193+
194+
flt = (sign << 31) + (exp << 23) + (binfloat << (23-s))
195+
print hex(flt)
196+
197+
*/
198+
};
199+
200+
/* This function is for calling when the Struct parser encounter a error */
201+
Struct.error = function(msg) {
202+
if(Struct.showerror)
203+
console.error("Struct: "+msg);
204+
};
205+
206+
/* This function is for notice the developer about a tip, or deprecated stuff */
207+
Struct.notice = function(msg) {
208+
if(Struct.shownotice)
209+
console.log("Struct: "+msg);
210+
};
211+
212+
struct = Struct;

0 commit comments

Comments
 (0)
0