bin_utils 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,684 @@
1
+ class String
2
+ unless method_defined?(:byteslice)
3
+ alias :byteslice :[]
4
+ end
5
+ end
6
+
7
+ module BinUtils
8
+ module PureRuby
9
+ extend self
10
+ INT32_INT32_LE = 'VV'.freeze
11
+ INT32_INT32_BE = 'NN'.freeze
12
+ MIN_INT = 0
13
+ MAX_INT64 = 2**64 - 1
14
+ MAX_INT32 = 2**32 - 1
15
+ MAX_INT16 = 2**16 - 1
16
+ MAX_INT8 = 2**8 - 1
17
+ MAX_SINT64 = 2**63 - 1
18
+ MAX_SINT32 = 2**31 - 1
19
+ MAX_SINT16 = 2**15 - 1
20
+ MAX_SINT8 = 2**7 - 1
21
+ MIN_SINT64 = -(2**63)
22
+ MIN_SINT32 = -(2**31)
23
+ MIN_SINT16 = -(2**15)
24
+ MIN_SINT8 = -(2**7)
25
+ EMPTY = ''.freeze
26
+ ONE = "\x01".freeze
27
+
28
+ def get_int8(data, i=0)
29
+ data.getbyte(i)
30
+ end
31
+
32
+ def slice_int8!(data)
33
+ int = data.getbyte(0)
34
+ data[0, 1] = EMPTY
35
+ int
36
+ end
37
+
38
+ def get_int16_le(data, i=0)
39
+ data.getbyte(i) + data.getbyte(i+1) * 256
40
+ end
41
+
42
+ def slice_int16_le!(data)
43
+ int = data.getbyte(0) + data.getbyte(1) * 256
44
+ data[0, 2] = EMPTY
45
+ int
46
+ end
47
+
48
+ def get_int16_be(data, i=0)
49
+ data.getbyte(i+1) + data.getbyte(i) * 256
50
+ end
51
+
52
+ def slice_int16_be!(data)
53
+ int = data.getbyte(1) + data.getbyte(0) * 256
54
+ data[0, 2] = EMPTY
55
+ int
56
+ end
57
+
58
+ def get_int24_le(data, i=0)
59
+ data.getbyte(i) + data.getbyte(i+1) * 256 + data.getbyte(i+2) * 65536
60
+ end
61
+
62
+ def slice_int24_le!(data)
63
+ int = data.getbyte(0) + data.getbyte(1) * 256 + data.getbyte(2) * 65536
64
+ data[0, 3] = EMPTY
65
+ int
66
+ end
67
+
68
+ def get_int24_be(data, i=0)
69
+ data.getbyte(i+2) + data.getbyte(i+1) * 256 + data.getbyte(i) * 65536
70
+ end
71
+
72
+ def slice_int24_be!(data)
73
+ int = data.getbyte(2) + data.getbyte(1) * 256 + data.getbyte(0) * 65536
74
+ data[0, 3] = EMPTY
75
+ int
76
+ end
77
+
78
+ def get_int32_le(data, i=0)
79
+ (data.getbyte(i) + data.getbyte(i+1) * 256 +
80
+ data.getbyte(i+2) * 65536 + data.getbyte(i+3) * 16777216)
81
+ end
82
+
83
+ def slice_int32_le!(data)
84
+ int = (data.getbyte(0) + data.getbyte(1) * 256 +
85
+ data.getbyte(2) * 65536 + data.getbyte(3) * 16777216)
86
+ data[0, 4] = EMPTY
87
+ int
88
+ end
89
+
90
+ def get_int32_be(data, i=0)
91
+ (data.getbyte(i+3) + data.getbyte(i+2) * 256 +
92
+ data.getbyte(i+1) * 65536 + data.getbyte(i) * 16777216)
93
+ end
94
+
95
+ def slice_int32_be!(data)
96
+ int = (data.getbyte(3) + data.getbyte(2) * 256 +
97
+ data.getbyte(1) * 65536 + data.getbyte(0) * 16777216)
98
+ data[0, 4] = EMPTY
99
+ int
100
+ end
101
+
102
+ def get_int40_le(data, i=0)
103
+ (data.getbyte(i) + data.getbyte(i+1) * 256 +
104
+ data.getbyte(i+2) * 65536 + data.getbyte(i+3) * 16777216 +
105
+ (data.getbyte(i+4) << 32))
106
+ end
107
+
108
+ def slice_int40_le!(data)
109
+ int = (data.getbyte(0) + data.getbyte(1) * 256 +
110
+ data.getbyte(2) * 65536 + data.getbyte(3) * 16777216 +
111
+ (data.getbyte(4) << 32))
112
+ data[0, 5] = EMPTY
113
+ int
114
+ end
115
+
116
+ def get_int40_be(data, i=0)
117
+ (data.getbyte(i+4) + data.getbyte(i+3) * 256 +
118
+ data.getbyte(i+2) * 65536 + data.getbyte(i+1) * 16777216 +
119
+ (data.getbyte(i) << 32))
120
+ end
121
+
122
+ def slice_int40_be!(data)
123
+ int = (data.getbyte(4) + data.getbyte(3) * 256 +
124
+ data.getbyte(2) * 65536 + data.getbyte(1) * 16777216 +
125
+ (data.getbyte(0) << 32))
126
+ data[0, 5] = EMPTY
127
+ int
128
+ end
129
+
130
+ INT32_INT16_LE = 'Vv'.freeze
131
+ def slice_int48_le!(data)
132
+ int0, int1 = data.unpack(INT32_INT16_LE)
133
+ data[0, 6] = EMPTY
134
+ int0 + (int1 << 32)
135
+ end
136
+
137
+ def get_int48_le(data, i=0)
138
+ data = data.byteslice(i, 6) if i > 0
139
+ int0, int1 = data.unpack(INT32_INT16_LE)
140
+ int0 + (int1 << 32)
141
+ end
142
+
143
+ INT16_INT32_BE = 'nN'.freeze
144
+ def slice_int48_be!(data)
145
+ int1, int0 = data.unpack(INT16_INT32_BE)
146
+ data[0, 6] = EMPTY
147
+ int0 + (int1 << 32)
148
+ end
149
+
150
+ def get_int48_be(data, i=0)
151
+ data = data.byteslice(i, 6) if i > 0
152
+ int1, int0 = data.unpack(INT16_INT32_BE)
153
+ int0 + (int1 << 32)
154
+ end
155
+
156
+ INT32_INT16_INT8_LE = 'VvC'.freeze
157
+ def slice_int56_le!(data)
158
+ int0, int1, int2 = data.unpack(INT32_INT16_INT8_LE)
159
+ data[0, 7] = EMPTY
160
+ int0 + (int1 << 32) + (int2 << 48)
161
+ end
162
+
163
+ def get_int56_le(data, i=0)
164
+ data = data.byteslice(i, 7) if i > 0
165
+ int0, int1, int2 = data.unpack(INT32_INT16_INT8_LE)
166
+ int0 + (int1 << 32) + (int2 << 48)
167
+ end
168
+
169
+ INT8_INT16_INT32_BE = 'CnN'.freeze
170
+ def slice_int56_be!(data)
171
+ int2, int1, int0 = data.unpack(INT8_INT16_INT32_BE)
172
+ data[0, 7] = EMPTY
173
+ int0 + (int1 << 32) + (int2 << 48)
174
+ end
175
+
176
+ def get_int56_be(data, i=0)
177
+ data = data.byteslice(i, 7) if i > 0
178
+ int2, int1, int0 = data.unpack(INT8_INT16_INT32_BE)
179
+ int0 + (int1 << 32) + (int2 << 48)
180
+ end
181
+
182
+ def slice_int64_le!(data)
183
+ int0, int1 = data.unpack(INT32_INT32_LE)
184
+ data[0, 8] = EMPTY
185
+ int0 + (int1 << 32)
186
+ end
187
+
188
+ def get_int64_le(data, i=0)
189
+ data = data.byteslice(i, 8) if i > 0
190
+ int0, int1 = data.unpack(INT32_INT32_LE)
191
+ int0 + (int1 << 32)
192
+ end
193
+
194
+ def slice_int64_be!(data)
195
+ int1, int0 = data.unpack(INT32_INT32_BE)
196
+ data[0, 8] = EMPTY
197
+ int0 + (int1 << 32)
198
+ end
199
+
200
+ def get_int64_be(data, i=0)
201
+ data = data.byteslice(i, 8) if i > 0
202
+ int1, int0 = data.unpack(INT32_INT32_BE)
203
+ int0 + (int1 << 32)
204
+ end
205
+
206
+ def get_sint8(data, i=0)
207
+ i = get_int8(data, i)
208
+ i - ((i & 128) << 1)
209
+ end
210
+
211
+ def slice_sint8!(data)
212
+ i = slice_int8!(data)
213
+ i - ((i & 128) << 1)
214
+ end
215
+
216
+ for size in [16, 24, 32, 40, 48, 56, 64]
217
+ for endian in %w{le be}
218
+ class_eval <<-EOF, __FILE__, __LINE__
219
+ def get_sint#{size}_#{endian}(data, i=0)
220
+ i = get_int#{size}_#{endian}(data, i)
221
+ i - ((i >> #{size - 1}) << #{size})
222
+ end
223
+
224
+ def slice_sint#{size}_#{endian}!(data)
225
+ i = slice_int#{size}_#{endian}!(data)
226
+ i - ((i >> #{size - 1}) << #{size})
227
+ end
228
+ EOF
229
+ end
230
+ end
231
+
232
+ BER_5 = 128 ** 5
233
+ BER_6 = 128 ** 6
234
+ BER_7 = 128 ** 7
235
+ BER_8 = 128 ** 8
236
+ BER_9 = 128 ** 9
237
+ def ber_size(int)
238
+ int < 128 ? 1 :
239
+ int < 16384 ? 2 :
240
+ int < 2097153 ? 3 :
241
+ int < 268435456 ? 4 :
242
+ int < BER_5 ? 5 :
243
+ int < BER_6 ? 6 :
244
+ int < BER_7 ? 7 :
245
+ int < BER_8 ? 8 :
246
+ int < BER_9 ? 9 :
247
+ 10
248
+ end
249
+
250
+ def get_ber(data, i=0)
251
+ res = 0
252
+ while true
253
+ if (byte = data.getbyte(i)) <= 127
254
+ res += byte
255
+ break
256
+ else
257
+ res = (res + (byte - 128)) * 128
258
+ i += 1
259
+ end
260
+ end
261
+ res
262
+ end
263
+
264
+ def slice_ber!(data)
265
+ res = 0
266
+ pos = 0
267
+ while true
268
+ if (byte = data.getbyte(pos)) <= 127
269
+ res += byte
270
+ break
271
+ else
272
+ res = (res + (byte - 128)) * 128
273
+ pos += 1
274
+ end
275
+ end
276
+ data[0, pos+1] = EMPTY
277
+ res
278
+ end
279
+
280
+ def append_int8!(str, int)
281
+ str << (int & 255)
282
+ end
283
+
284
+ def append_bersize_int8!(str, int)
285
+ str << 1 << (int & 255)
286
+ end
287
+
288
+ def append_int16_le!(str, int)
289
+ str << (int & 255) << ((int>>8) & 255)
290
+ end
291
+
292
+ def append_int24_le!(str, int)
293
+ str << (int & 255) << ((int>>8) & 255) <<
294
+ ((int>>16) & 255)
295
+ end
296
+
297
+ def append_int32_le!(str, int)
298
+ str << (int & 255) << ((int>>8) & 255) <<
299
+ ((int>>16) & 255) << ((int>>24) & 255)
300
+ end
301
+
302
+ def append_int40_le!(str, int)
303
+ str << (int & 255) << ((int>>8) & 255) <<
304
+ ((int>>16) & 255) << ((int>>24) & 255) <<
305
+ ((int>>32) & 255)
306
+ end
307
+
308
+ def append_int48_le!(str, int)
309
+ str << [int & MAX_INT32, int >> 32].pack(INT32_INT16_LE)
310
+ end
311
+
312
+ def append_int56_le!(str, int)
313
+ str << [int & MAX_INT32, (int >> 32) & MAX_INT16, (int >> 48)].pack(INT32_INT16_INT8_LE)
314
+ end
315
+
316
+ def append_int64_le!(str, int)
317
+ str << [int & MAX_INT32, int >> 32].pack(INT32_INT32_LE)
318
+ end
319
+
320
+ alias append_sint8! append_int8!
321
+ alias append_sint16_le! append_int16_le!
322
+ alias append_sint24_le! append_int24_le!
323
+ alias append_sint32_le! append_int32_le!
324
+ alias append_sint40_le! append_int40_le!
325
+ alias append_sint48_le! append_int48_le!
326
+ alias append_sint56_le! append_int56_le!
327
+ alias append_sint64_le! append_int64_le!
328
+
329
+ def append_int16_be!(str, int)
330
+ str << ((int>>8) & 255) << (int & 255)
331
+ end
332
+
333
+ def append_int24_be!(str, int)
334
+ str << ((int>>16) & 255) << ((int>>8) & 255) << (int & 255)
335
+ end
336
+
337
+ def append_int32_be!(str, int)
338
+ str << ((int>>24) & 255) << ((int>>16) & 255) <<
339
+ ((int>>8) & 255) << (int & 255)
340
+ end
341
+
342
+ def append_int40_be!(str, int)
343
+ str << ((int>>32) & 255) << ((int>>24) & 255) <<
344
+ ((int>>16) & 255) << ((int>>8) & 255) <<
345
+ (int & 255)
346
+ end
347
+
348
+ def append_int48_be!(str, int)
349
+ str << [int >> 32, int & MAX_INT32].pack(INT16_INT32_BE)
350
+ end
351
+
352
+ def append_int56_be!(str, int)
353
+ str << [(int >> 48), (int >> 32) & MAX_INT16, int & MAX_INT32].pack(INT8_INT16_INT32_BE)
354
+ end
355
+
356
+ def append_int64_be!(str, int)
357
+ str << [int >> 32, int & MAX_INT32].pack(INT32_INT32_BE)
358
+ end
359
+
360
+ alias append_sint8! append_int8!
361
+ alias append_sint16_be! append_int16_be!
362
+ alias append_sint24_be! append_int24_be!
363
+ alias append_sint32_be! append_int32_be!
364
+ alias append_sint40_be! append_int40_be!
365
+ alias append_sint48_be! append_int48_be!
366
+ alias append_sint56_be! append_int56_be!
367
+ alias append_sint64_be! append_int64_be!
368
+
369
+ def append_bersize_int16_le!(str, int)
370
+ str << 2 << (int & 255) << ((int>>8) & 255)
371
+ end
372
+
373
+ def append_bersize_int24_le!(str, int)
374
+ str << 3 << (int & 255) << ((int>>8) & 255) <<
375
+ ((int>>16) & 255)
376
+ end
377
+
378
+ def append_bersize_int32_le!(str, int)
379
+ str << 4 <<
380
+ (int & 255) << ((int>>8) & 255) <<
381
+ ((int>>16) & 255) << ((int>>24) & 255)
382
+ end
383
+
384
+ def append_bersize_int40_le!(str, int)
385
+ str << 5 <<
386
+ (int & 255) << ((int>>8) & 255) <<
387
+ ((int>>16) & 255) << ((int>>24) & 255) <<
388
+ ((int>>32) & 255)
389
+ end
390
+
391
+ def append_bersize_int48_le!(str, int)
392
+ str << 6 << [int & MAX_INT32, int >> 32].pack(INT32_INT16_LE)
393
+ end
394
+
395
+ def append_bersize_int56_le!(str, int)
396
+ str << 7 << [int & MAX_INT32, (int >> 32) & MAX_INT16, (int >> 48)].pack(INT32_INT16_INT8_LE)
397
+ end
398
+
399
+ def append_bersize_int64_le!(str, int)
400
+ str << 8 << [int & MAX_INT32, int >> 32].pack(INT32_INT32_LE)
401
+ end
402
+
403
+ alias append_bersize_sint8! append_bersize_int8!
404
+ alias append_bersize_sint16_le! append_bersize_int16_le!
405
+ alias append_bersize_sint24_le! append_bersize_int24_le!
406
+ alias append_bersize_sint32_le! append_bersize_int32_le!
407
+ alias append_bersize_sint40_le! append_bersize_int40_le!
408
+ alias append_bersize_sint48_le! append_bersize_int48_le!
409
+ alias append_bersize_sint56_le! append_bersize_int56_le!
410
+ alias append_bersize_sint64_le! append_bersize_int64_le!
411
+
412
+ def append_bersize_int16_be!(str, int)
413
+ str << 2 << ((int>>8) & 255) << (int & 255)
414
+ end
415
+
416
+ def append_bersize_int24_be!(str, int)
417
+ str << 3 << ((int>>16) & 255) << ((int>>8) & 255) << (int & 255)
418
+ end
419
+
420
+ def append_bersize_int32_be!(str, int)
421
+ str << 4 <<
422
+ ((int>>24) & 255) << ((int>>16) & 255) <<
423
+ ((int>>8) & 255) << (int & 255)
424
+ end
425
+
426
+ def append_bersize_int40_be!(str, int)
427
+ str << 5 <<
428
+ ((int>>32) & 255) << ((int>>24) & 255) <<
429
+ ((int>>16) & 255) << ((int>>8) & 255) <<
430
+ (int & 255)
431
+ end
432
+
433
+ def append_bersize_int48_be!(str, int)
434
+ str << 6 << [int >> 32, int & MAX_INT32].pack(INT16_INT32_BE)
435
+ end
436
+
437
+ def append_bersize_int56_be!(str, int)
438
+ str << 7 << [(int >> 48), (int >> 32) & MAX_INT16, int & MAX_INT32].pack(INT8_INT16_INT32_BE)
439
+ end
440
+
441
+ def append_bersize_int64_be!(str, int)
442
+ str << 8 << [int >> 32, int & MAX_INT32].pack(INT32_INT32_BE)
443
+ end
444
+
445
+ alias append_bersize_sint16_be! append_bersize_int16_be!
446
+ alias append_bersize_sint24_be! append_bersize_int24_be!
447
+ alias append_bersize_sint32_be! append_bersize_int32_be!
448
+ alias append_bersize_sint40_be! append_bersize_int40_be!
449
+ alias append_bersize_sint48_be! append_bersize_int48_be!
450
+ alias append_bersize_sint56_be! append_bersize_int56_be!
451
+ alias append_bersize_sint64_be! append_bersize_int64_be!
452
+
453
+ INT32LE_1 = "\x01\x00\x00\x00"
454
+ INT32LE_2 = "\x02\x00\x00\x00"
455
+ INT32LE_3 = "\x03\x00\x00\x00"
456
+ INT32LE_4 = "\x04\x00\x00\x00"
457
+ INT32LE_5 = "\x05\x00\x00\x00"
458
+ INT32LE_6 = "\x06\x00\x00\x00"
459
+ INT32LE_7 = "\x07\x00\x00\x00"
460
+ INT32LE_8 = "\x08\x00\x00\x00"
461
+ def append_int32lesize_int8!(str, int)
462
+ str << INT32LE_1 << (int & 255)
463
+ end
464
+
465
+ def append_int32lesize_int16_le!(str, int)
466
+ str << INT32LE_2 << (int & 255) << ((int>>8) & 255)
467
+ end
468
+
469
+ def append_int32lesize_int24_le!(str, int)
470
+ str << INT32LE_3 << (int & 255) << ((int>>8) & 255) <<
471
+ ((int>>16) & 255)
472
+ end
473
+
474
+ def append_int32lesize_int32_le!(str, int)
475
+ str << INT32LE_4 <<
476
+ (int & 255) << ((int>>8) & 255) <<
477
+ ((int>>16) & 255) << ((int>>24) & 255)
478
+ end
479
+
480
+ def append_int32lesize_int40_le!(str, int)
481
+ str << INT32LE_5 <<
482
+ (int & 255) << ((int>>8) & 255) <<
483
+ ((int>>16) & 255) << ((int>>24) & 255) <<
484
+ ((int>>32) & 255)
485
+ end
486
+
487
+ def append_int32lesize_int48_le!(str, int)
488
+ str << INT32LE_6 << [int & MAX_INT32, int >> 32].pack(INT32_INT16_LE)
489
+ end
490
+
491
+ def append_int32lesize_int56_le!(str, int)
492
+ str << INT32LE_7 << [int & MAX_INT32, (int >> 32) & MAX_INT16, (int >> 48)].pack(INT32_INT16_INT8_LE)
493
+ end
494
+
495
+ def append_int32lesize_int64_le!(str, int)
496
+ str << INT32LE_8 << [int & MAX_INT32, int >> 32].pack(INT32_INT32_LE)
497
+ end
498
+
499
+ alias append_int32lesize_sint8! append_int32lesize_int8!
500
+ alias append_int32lesize_sint16_le! append_int32lesize_int16_le!
501
+ alias append_int32lesize_sint24_le! append_int32lesize_int24_le!
502
+ alias append_int32lesize_sint32_le! append_int32lesize_int32_le!
503
+ alias append_int32lesize_sint40_le! append_int32lesize_int40_le!
504
+ alias append_int32lesize_sint48_le! append_int32lesize_int48_le!
505
+ alias append_int32lesize_sint56_le! append_int32lesize_int56_le!
506
+ alias append_int32lesize_sint64_le! append_int32lesize_int64_le!
507
+
508
+ def append_int32lesize_int16_be!(str, int)
509
+ str << INT32LE_2 << ((int>>8) & 255) << (int & 255)
510
+ end
511
+
512
+ def append_int32lesize_int24_be!(str, int)
513
+ str << INT32LE_3 << ((int>>16) & 255) << ((int>>8) & 255) << (int & 255)
514
+ end
515
+
516
+ def append_int32lesize_int32_be!(str, int)
517
+ str << INT32LE_4 <<
518
+ ((int>>24) & 255) << ((int>>16) & 255) <<
519
+ ((int>>8) & 255) << (int & 255)
520
+ end
521
+
522
+ def append_int32lesize_int40_be!(str, int)
523
+ str << INT32LE_5 <<
524
+ ((int>>32) & 255) << ((int>>24) & 255) <<
525
+ ((int>>16) & 255) << ((int>>8) & 255) <<
526
+ (int & 255)
527
+ end
528
+
529
+ def append_int32lesize_int48_be!(str, int)
530
+ str << INT32LE_6 << [int >> 32, int & MAX_INT32].pack(INT16_INT32_BE)
531
+ end
532
+
533
+ def append_int32lesize_int56_be!(str, int)
534
+ str << INT32LE_7 << [(int >> 48), (int >> 32) & MAX_INT16, int & MAX_INT32].pack(INT8_INT16_INT32_BE)
535
+ end
536
+
537
+ def append_int32lesize_int64_be!(str, int)
538
+ str << INT32LE_8 << [int >> 32, int & MAX_INT32].pack(INT32_INT32_BE)
539
+ end
540
+
541
+ alias append_int32lesize_sint16_be! append_int32lesize_int16_be!
542
+ alias append_int32lesize_sint24_be! append_int32lesize_int24_be!
543
+ alias append_int32lesize_sint32_be! append_int32lesize_int32_be!
544
+ alias append_int32lesize_sint40_be! append_int32lesize_int40_be!
545
+ alias append_int32lesize_sint48_be! append_int32lesize_int48_be!
546
+ alias append_int32lesize_sint56_be! append_int32lesize_int56_be!
547
+ alias append_int32lesize_sint64_be! append_int32lesize_int64_be!
548
+
549
+ INT32BE_1 = "\x00\x00\x00\x01"
550
+ INT32BE_2 = "\x00\x00\x00\x02"
551
+ INT32BE_3 = "\x00\x00\x00\x03"
552
+ INT32BE_4 = "\x00\x00\x00\x04"
553
+ INT32BE_5 = "\x00\x00\x00\x05"
554
+ INT32BE_6 = "\x00\x00\x00\x06"
555
+ INT32BE_7 = "\x00\x00\x00\x07"
556
+ INT32BE_8 = "\x00\x00\x00\x08"
557
+ def append_int32besize_int8!(str, int)
558
+ str << INT32BE_1 << (int & 255)
559
+ end
560
+
561
+ def append_int32besize_int16_le!(str, int)
562
+ str << INT32BE_2 << (int & 255) << ((int>>8) & 255)
563
+ end
564
+
565
+ def append_int32besize_int24_le!(str, int)
566
+ str << INT32BE_3 << (int & 255) << ((int>>8) & 255) <<
567
+ ((int>>16) & 255)
568
+ end
569
+
570
+ def append_int32besize_int32_le!(str, int)
571
+ str << INT32BE_4 <<
572
+ (int & 255) << ((int>>8) & 255) <<
573
+ ((int>>16) & 255) << ((int>>24) & 255)
574
+ end
575
+
576
+ def append_int32besize_int40_le!(str, int)
577
+ str << INT32BE_5 <<
578
+ (int & 255) << ((int>>8) & 255) <<
579
+ ((int>>16) & 255) << ((int>>24) & 255) <<
580
+ ((int>>32) & 255)
581
+ end
582
+
583
+ def append_int32besize_int48_le!(str, int)
584
+ str << INT32BE_6 << [int & MAX_INT32, int >> 32].pack(INT32_INT16_LE)
585
+ end
586
+
587
+ def append_int32besize_int56_le!(str, int)
588
+ str << INT32BE_7 << [int & MAX_INT32, (int >> 32) & MAX_INT16, (int >> 48)].pack(INT32_INT16_INT8_LE)
589
+ end
590
+
591
+ def append_int32besize_int64_le!(str, int)
592
+ str << INT32BE_8 << [int & MAX_INT32, int >> 32].pack(INT32_INT32_LE)
593
+ end
594
+
595
+ alias append_int32besize_sint8! append_int32besize_int8!
596
+ alias append_int32besize_sint16_le! append_int32besize_int16_le!
597
+ alias append_int32besize_sint24_le! append_int32besize_int24_le!
598
+ alias append_int32besize_sint32_le! append_int32besize_int32_le!
599
+ alias append_int32besize_sint40_le! append_int32besize_int40_le!
600
+ alias append_int32besize_sint48_le! append_int32besize_int48_le!
601
+ alias append_int32besize_sint56_le! append_int32besize_int56_le!
602
+ alias append_int32besize_sint64_le! append_int32besize_int64_le!
603
+
604
+ def append_int32besize_int16_be!(str, int)
605
+ str << INT32BE_2 << ((int>>8) & 255) << (int & 255)
606
+ end
607
+
608
+ def append_int32besize_int24_be!(str, int)
609
+ str << INT32BE_3 << ((int>>16) & 255) << ((int>>8) & 255) << (int & 255)
610
+ end
611
+
612
+ def append_int32besize_int32_be!(str, int)
613
+ str << INT32BE_4 <<
614
+ ((int>>24) & 255) << ((int>>16) & 255) <<
615
+ ((int>>8) & 255) << (int & 255)
616
+ end
617
+
618
+ def append_int32besize_int40_be!(str, int)
619
+ str << INT32BE_5 <<
620
+ ((int>>32) & 255) << ((int>>24) & 255) <<
621
+ ((int>>16) & 255) << ((int>>8) & 255) <<
622
+ (int & 255)
623
+ end
624
+
625
+ def append_int32besize_int48_be!(str, int)
626
+ str << INT32BE_6 << [int >> 32, int & MAX_INT32].pack(INT16_INT32_BE)
627
+ end
628
+
629
+ def append_int32besize_int56_be!(str, int)
630
+ str << INT32BE_7 << [(int >> 48), (int >> 32) & MAX_INT16, int & MAX_INT32].pack(INT8_INT16_INT32_BE)
631
+ end
632
+
633
+ def append_int32besize_int64_be!(str, int)
634
+ str << INT32BE_8 << [int >> 32, int & MAX_INT32].pack(INT32_INT32_BE)
635
+ end
636
+
637
+ alias append_int32besize_sint16_be! append_int32besize_int16_be!
638
+ alias append_int32besize_sint24_be! append_int32besize_int24_be!
639
+ alias append_int32besize_sint32_be! append_int32besize_int32_be!
640
+ alias append_int32besize_sint40_be! append_int32besize_int40_be!
641
+ alias append_int32besize_sint48_be! append_int32besize_int48_be!
642
+ alias append_int32besize_sint56_be! append_int32besize_int56_be!
643
+ alias append_int32besize_sint64_be! append_int32besize_int64_be!
644
+
645
+ BINARY = ::Encoding::BINARY
646
+ def append_string!(data, str)
647
+ data << str.dup.force_encoding(BINARY)
648
+ end
649
+
650
+ BER_STRING = "wa*".freeze
651
+ INT32LE_STRING = "Va*".freeze
652
+ INT32BE_STRING = "Na*".freeze
653
+ def append_bersize_string!(data, str)
654
+ data << [str.bytesize, str].pack(BER_STRING)
655
+ end
656
+
657
+ def append_int32lesize_string!(data, str)
658
+ data << [str.bytesize, str].pack(INT32LE_STRING)
659
+ end
660
+
661
+ def append_int32besize_string!(data, str)
662
+ data << [str.bytesize, str].pack(INT32BE_STRING)
663
+ end
664
+
665
+ BER = 'w'
666
+ INT32LE_BER = 'Vw'
667
+ INT32BE_BER = 'Nw'
668
+ def append_ber!(data, int)
669
+ data << [int].pack(BER)
670
+ end
671
+
672
+ def append_bersize_ber!(data, int)
673
+ data << ber_size(int) << [int].pack(BER)
674
+ end
675
+
676
+ def append_int32lesize_ber!(data, int)
677
+ data << [ber_size(int), int].pack(INT32LE_BER)
678
+ end
679
+
680
+ def append_int32besize_ber!(data, int)
681
+ data << [ber_size(int), int].pack(INT32BE_BER)
682
+ end
683
+ end
684
+ end
@@ -0,0 +1,3 @@
1
+ module BinUtils
2
+ VERSION = "0.0.1"
3
+ end
data/lib/bin_utils.rb ADDED
@@ -0,0 +1,14 @@
1
+ require "bin_utils/version"
2
+
3
+ module BinUtils
4
+ begin
5
+ require 'bin_utils/native_bin_utils'
6
+ extend Native
7
+ rescue LoadError
8
+ require 'bin_utils/pure_ruby'
9
+ extend PureRuby
10
+ if RUBY_ENGINE == 'ruby'
11
+ $stderr.puts "Attention: pure ruby version of BinUtils is used"
12
+ end
13
+ end
14
+ end