bin_utils 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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