codec 0.0.11 → 0.0.12
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.
- data/lib/codec/bitmap.rb +1 -1
- data/lib/codec/eight_bits_encoding.rb +65 -0
- data/lib/codec/fix.rb +101 -1
- data/lib/codec/prefix.rb +6 -6
- data/lib/codec/tlv.rb +1 -1
- data/lib/codec/version.rb +1 -1
- data/lib/codec.rb +1 -0
- data/test/lib/codec/eightbits_test.rb +38 -0
- metadata +5 -2
data/lib/codec/bitmap.rb
CHANGED
|
@@ -93,7 +93,7 @@ module Codec
|
|
|
93
93
|
f = Field.new("ERR")
|
|
94
94
|
f.set_value(buf.unpack("H*").first)
|
|
95
95
|
msg.add_sub_field(f)
|
|
96
|
-
raise ParsingException
|
|
96
|
+
raise ParsingException.new "#{msg}\nError unknown field #{field_tag} : "
|
|
97
97
|
end
|
|
98
98
|
end
|
|
99
99
|
return msg,buf
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
module Codec
|
|
3
|
+
module EightBitsEncoding
|
|
4
|
+
ASCII_EBCDIC = ["
|
|
5
|
+
00010203372D2E2F1605250B0C0D0E0F101112133C3D322618193F271C1D1E1F
|
|
6
|
+
405A7F7B5B6C507D4D5D5C4E6B604B61F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F
|
|
7
|
+
7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6D7D8D9E2E3E4E5E6E7E8E94AE05A5F6D
|
|
8
|
+
79818283848586878889919293949596979899A2A3A4A5A6A7A8A9C06AD0A107
|
|
9
|
+
C3E4858181818183858585898989C1C1C50707969696A4A4A8D6E40707070707
|
|
10
|
+
818996A495D5810707070707070707070707070707C1C1C10707070707070707
|
|
11
|
+
07070707070781C10707070707070707070707070789C9C9C907070707070707
|
|
12
|
+
D607D6D696D6070707E4E4E4A8E8070707070707070707070707070707070707
|
|
13
|
+
".gsub(/[^0-9a-fA-F]/i,'')].pack("H*")
|
|
14
|
+
|
|
15
|
+
EBCDIC_ASCII = ["
|
|
16
|
+
000102037F097F7F7F7F600B0C0D0E0F101112133C0A087F18197F7F1C1D1E1F
|
|
17
|
+
7F7F7F7F7F0A171B7F7F7F7F7F0506077F7F167F7F7F7F047F7F7F7F14157F1A
|
|
18
|
+
207F7F7F7F7F7F7F7F7F5B2E3C282B21267F7F7F7F7F7F7F7F7F21242A293B5E
|
|
19
|
+
2D2F7F7F7F7F7F7F7F7F7C2C255F3E3F7F7F7F7F7F7F7F7F7F603A2340273D22
|
|
20
|
+
7F6162636465666768697F7F7F7F7F7F7F6A6B6C6D6E6F7071727F7F7F7F7F7F
|
|
21
|
+
7F7E737475767778797A7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F
|
|
22
|
+
7B4142434445464748497F7F7F7F7F7F7D4A4B4C4D4E4F5051527F7F7F7F7F7F
|
|
23
|
+
5C7F535455565758595A7F7F7F7F7F7F303132333435363738397F7F7F7F7F7F
|
|
24
|
+
".gsub(/[^0-9a-fA-F]/i,'')].pack("H*")
|
|
25
|
+
|
|
26
|
+
ASCII_EXTENTION = (128..175).to_a + (224..255).to_a +
|
|
27
|
+
["B5B6B7B8BDBEC6C7CFD0D1D2D3D4D5D6D7D8DE"].pack("H*").bytes.to_a
|
|
28
|
+
UTF_8_EXTENTION = ["ÇÜéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»",
|
|
29
|
+
"ÓßÔÒõÕμþÞÚÛÙýݯ´-±_¾¶§÷¸°¨·¹³²_.", "ÁÂÀ©¢¥ãäðÐÊËÈiÍÎÏÌ"].join.chars.to_a
|
|
30
|
+
EXT_ASC_TO_UTF8 = Hash[ASCII_EXTENTION.zip(UTF_8_EXTENTION)]
|
|
31
|
+
EXT_UTF8_TO_ASC = Hash[UTF_8_EXTENTION.zip(ASCII_EXTENTION)]
|
|
32
|
+
|
|
33
|
+
def self.UTF8_2_ASCII(buf)
|
|
34
|
+
buf.chars.collect { |c|
|
|
35
|
+
if c.getbyte(0) < 128
|
|
36
|
+
c
|
|
37
|
+
elsif EXT_UTF8_TO_ASC[c].nil?
|
|
38
|
+
127.chr
|
|
39
|
+
else
|
|
40
|
+
EXT_UTF8_TO_ASC[c].chr
|
|
41
|
+
end
|
|
42
|
+
}.join
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def self.ASCII_2_UTF8(buf)
|
|
46
|
+
buf.bytes.collect { |b|
|
|
47
|
+
if b < 128
|
|
48
|
+
b.chr
|
|
49
|
+
elsif EXT_ASC_TO_UTF8[b].nil?
|
|
50
|
+
127.chr # using ascii padding character
|
|
51
|
+
else
|
|
52
|
+
EXT_ASC_TO_UTF8[b]
|
|
53
|
+
end
|
|
54
|
+
}.join
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def self.EBCDIC_2_UTF8(buf)
|
|
58
|
+
ASCII_2_UTF8(buf.bytes.collect { |b| EBCDIC_ASCII.getbyte(b).chr }.join)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def self.UTF8_2_EBCDIC(buf)
|
|
62
|
+
UTF8_2_ASCII(buf).bytes.collect { |b| ASCII_EBCDIC.getbyte(b).chr }.join
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
data/lib/codec/fix.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
module Codec
|
|
2
|
+
|
|
2
3
|
class Numbin < Base
|
|
3
4
|
def build_field(buf,length)
|
|
4
5
|
f = Field.new(@id)
|
|
@@ -36,7 +37,7 @@ module Codec
|
|
|
36
37
|
end
|
|
37
38
|
end
|
|
38
39
|
|
|
39
|
-
class
|
|
40
|
+
class Numstr < Base
|
|
40
41
|
def build_field(buf,length)
|
|
41
42
|
f = Field.new(@id)
|
|
42
43
|
f.set_value(buf[0,length].to_i)
|
|
@@ -53,6 +54,64 @@ module Codec
|
|
|
53
54
|
end
|
|
54
55
|
end
|
|
55
56
|
|
|
57
|
+
class Numasc < Numstr
|
|
58
|
+
# This class is a copy of Numstr class because UTF8 and ASCII
|
|
59
|
+
# have the same encoding for digits number
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
class Numebc < Base
|
|
63
|
+
def build_field(buf,length)
|
|
64
|
+
f = Field.new(@id)
|
|
65
|
+
f.set_value(EightBitsEncoding::EBCDIC_2_UTF8(buf[0,length]).to_i)
|
|
66
|
+
return f
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def encode(field)
|
|
70
|
+
out = field.get_value.to_s
|
|
71
|
+
if @length > 0
|
|
72
|
+
out = out.rjust(@length,"0")
|
|
73
|
+
raise TooLongDataException if out.length > @length
|
|
74
|
+
end
|
|
75
|
+
return EightBitsEncoding::UTF8_2_EBCDIC(out)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
class Ebcdic < Base
|
|
81
|
+
def build_field(buf,length)
|
|
82
|
+
f = Field.new(@id)
|
|
83
|
+
f.set_value(EightBitsEncoding::EBCDIC_2_UTF8(buf[0,length]))
|
|
84
|
+
return f
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def encode(f)
|
|
88
|
+
out = f.get_value
|
|
89
|
+
if @length > 0
|
|
90
|
+
raise TooLongDataException if out.length > @length
|
|
91
|
+
out = out.ljust(@length," ")
|
|
92
|
+
end
|
|
93
|
+
return EightBitsEncoding::UTF8_2_EBCDIC(out)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
class Ascii < Base
|
|
98
|
+
def build_field(buf,length)
|
|
99
|
+
f = Field.new(@id)
|
|
100
|
+
f.set_value(EightBitsEncoding::ASCII_2_UTF8(buf[0,length]))
|
|
101
|
+
return f
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def encode(f)
|
|
105
|
+
out = f.get_value
|
|
106
|
+
if @length > 0
|
|
107
|
+
raise TooLongDataException if out.length > @length
|
|
108
|
+
out = out.ljust(@length," ")
|
|
109
|
+
end
|
|
110
|
+
return EightBitsEncoding::UTF8_2_ASCII(out)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
|
|
56
115
|
class String < Base
|
|
57
116
|
def build_field(buf,length)
|
|
58
117
|
f = Field.new(@id)
|
|
@@ -86,4 +145,45 @@ module Codec
|
|
|
86
145
|
return out
|
|
87
146
|
end
|
|
88
147
|
end
|
|
148
|
+
|
|
149
|
+
# Class Auto Converting Ebcdic to ASCII for number and string
|
|
150
|
+
EBCDIC_2_ASCII = ["000102039C09867F978D8E0B0C0D0E0F101112139D8508871819928F1C1D1E1F"+
|
|
151
|
+
"80818283840A171B88898A8B8C050607909116939495960498999A9B14159E1A"+
|
|
152
|
+
"20A0A1A2A3A4A5A6A7A8D52E3C282B7C26A9AAABACADAEAFB0B121242A293B5E"+
|
|
153
|
+
"2D2FB2B3B4B5B6B7B8B9E52C255F3E3FBABBBCBDBEBFC0C1C2603A2340273D22"+
|
|
154
|
+
"C3616263646566676869C4C5C6C7C8C9CA6A6B6C6D6E6F707172CBCCCDCECFD0"+
|
|
155
|
+
"D17E737475767778797AD2D3D45BD6D7D8D9DADBDCDDDEDFE0E1E2E3E45DE6E7"+
|
|
156
|
+
"7B414243444546474849E8E9EAEBECED7D4A4B4C4D4E4F505152EEEFF0F1F2F3"+
|
|
157
|
+
"5C9F535455565758595AF4F5F6F7F8F930313233343536373839FAFBFCFDFEFF"].pack("H*")
|
|
158
|
+
|
|
159
|
+
class Numace < Numstr
|
|
160
|
+
def build_field(buf,length)
|
|
161
|
+
f = Field.new(@id)
|
|
162
|
+
|
|
163
|
+
data = ""
|
|
164
|
+
# if buf to decode is in EBCDIC then convert buf in ASCII
|
|
165
|
+
if ( buf[0,length].unpack("C*").select{|c| c >= 128}.size > 0)
|
|
166
|
+
buf[0,length].unpack("C*").each { |c| data += EBCDIC_2_ASCII[c] }
|
|
167
|
+
else
|
|
168
|
+
data = buf[0,length]
|
|
169
|
+
end
|
|
170
|
+
f.set_value(data.to_i)
|
|
171
|
+
return f
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
class Strace < String
|
|
176
|
+
def build_field(buf,length)
|
|
177
|
+
f = Field.new(@id)
|
|
178
|
+
data = ""
|
|
179
|
+
# if buf to decode is in EBCDIC then convert buf in ASCII
|
|
180
|
+
if ( buf[0,length].unpack("C*").select{|c| c >= 128}.size > 0)
|
|
181
|
+
buf[0,length].unpack("C*").each { |c| data += EBCDIC_2_ASCII[c] }
|
|
182
|
+
else
|
|
183
|
+
data = buf[0,length]
|
|
184
|
+
end
|
|
185
|
+
f.set_value(data)
|
|
186
|
+
return f
|
|
187
|
+
end
|
|
188
|
+
end
|
|
89
189
|
end
|
data/lib/codec/prefix.rb
CHANGED
|
@@ -24,7 +24,7 @@ module Codec
|
|
|
24
24
|
f,remain = @value_codec.decode_with_length(buf,len)
|
|
25
25
|
rescue => e
|
|
26
26
|
Logger.error "Error in #{@id} decoder \n #{e.message}\n#{e.backtrace.join(10.chr)}"
|
|
27
|
-
raise ParsingException
|
|
27
|
+
raise ParsingException.new e.message
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
f.set_id(@id)
|
|
@@ -35,8 +35,8 @@ module Codec
|
|
|
35
35
|
def build_field(buf,length)
|
|
36
36
|
begin
|
|
37
37
|
f,r = decode(buf[0,length])
|
|
38
|
-
rescue
|
|
39
|
-
raise ParsingException
|
|
38
|
+
rescue BufferUnderflow => e
|
|
39
|
+
raise ParsingException.new e.message
|
|
40
40
|
end
|
|
41
41
|
Logger.error "Error remain data in Prefixedlength" if r != ""
|
|
42
42
|
return f
|
|
@@ -90,7 +90,7 @@ module Codec
|
|
|
90
90
|
content_field = field.get_sub_field(@value_codec.id)
|
|
91
91
|
length, content = @value_codec.encode_with_length(content_field)
|
|
92
92
|
head_field = field.get_sub_field(@length_codec.id)
|
|
93
|
-
raise EncodingException
|
|
93
|
+
raise EncodingException.new "Missing header for encoding #{@id}" if head_field.empty?
|
|
94
94
|
# update length field in header if length !=0
|
|
95
95
|
head_field.set_value(length,@path,@separator) if length !=0
|
|
96
96
|
# encode header
|
|
@@ -113,7 +113,7 @@ module Codec
|
|
|
113
113
|
def decode(buffer)
|
|
114
114
|
tag,buf = @tag_codec.decode(buffer)
|
|
115
115
|
if @subCodecs[tag.get_value.to_s].nil?
|
|
116
|
-
raise ParsingException
|
|
116
|
+
raise ParsingException.new "Unknown tag #{tag.get_value.to_s} for #{@id} decoder"
|
|
117
117
|
end
|
|
118
118
|
f,buf = @subCodecs[tag.get_value.to_s].decode(buf)
|
|
119
119
|
f.set_id(tag.get_value.to_s)
|
|
@@ -124,7 +124,7 @@ module Codec
|
|
|
124
124
|
head = Field.new(@tag_codec.id, field.get_id)
|
|
125
125
|
out = @tag_codec.encode(head)
|
|
126
126
|
if @subCodecs[field.get_id].nil?
|
|
127
|
-
raise EncodingException
|
|
127
|
+
raise EncodingException.new "Unknown tag #{field.get_id} for #{@id} encoder"
|
|
128
128
|
end
|
|
129
129
|
out += @subCodecs[field.get_id].encode(field)
|
|
130
130
|
return out
|
data/lib/codec/tlv.rb
CHANGED
|
@@ -130,7 +130,7 @@ module Codec
|
|
|
130
130
|
|
|
131
131
|
def value_decode(buf,length)
|
|
132
132
|
if length > buf.length
|
|
133
|
-
raise
|
|
133
|
+
raise BufferUnderflow.new "Not enough data for parsing BER TLV
|
|
134
134
|
#{@id} length value #{length} remaining only #{buf.length}"
|
|
135
135
|
end
|
|
136
136
|
value = buf[0,length]
|
data/lib/codec/version.rb
CHANGED
data/lib/codec.rb
CHANGED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
require_relative '../../test_helper'
|
|
3
|
+
|
|
4
|
+
describe Codec::Ascii do
|
|
5
|
+
|
|
6
|
+
subject { Codec::Ascii.new('test',3) }
|
|
7
|
+
|
|
8
|
+
it "must be a Codec::Ascii" do
|
|
9
|
+
subject.must_be_instance_of(Codec::Ascii)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "must encode field from utf-8 to ascii" do
|
|
13
|
+
subject.encode(Codec::Field.new('test','été')).must_equal(["827482"].pack("H*"))
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "must decode from ascii stream to utf-8 field" do
|
|
17
|
+
subject.decode(["827482"].pack("H*")).first.must_equal(Codec::Field.new('test','été'))
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe Codec::Ebcdic do
|
|
23
|
+
|
|
24
|
+
subject { Codec::Ebcdic.new('test',3) }
|
|
25
|
+
|
|
26
|
+
it "must be a Codec::Ebcdic" do
|
|
27
|
+
subject.must_be_instance_of(Codec::Ebcdic)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "must encode field from utf-8 to Ebcdic" do
|
|
31
|
+
subject.encode(Codec::Field.new('test','été')).must_equal(["85A385"].pack("H*"))
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "must decode from Ebcdic stream to utf-8 field" do
|
|
35
|
+
subject.decode(["85A385"].pack("H*")).first.must_equal(Codec::Field.new('test','ete'))
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: codec
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.12
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2013-
|
|
12
|
+
date: 2013-10-15 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: bundler
|
|
@@ -77,6 +77,7 @@ files:
|
|
|
77
77
|
- lib/codec/base.rb
|
|
78
78
|
- lib/codec/bitmap.rb
|
|
79
79
|
- lib/codec/composed.rb
|
|
80
|
+
- lib/codec/eight_bits_encoding.rb
|
|
80
81
|
- lib/codec/exceptions.rb
|
|
81
82
|
- lib/codec/factory.rb
|
|
82
83
|
- lib/codec/field.rb
|
|
@@ -88,6 +89,7 @@ files:
|
|
|
88
89
|
- lib/codec/version.rb
|
|
89
90
|
- test/lib/codec/bitmap_test.rb
|
|
90
91
|
- test/lib/codec/composed_test.rb
|
|
92
|
+
- test/lib/codec/eightbits_test.rb
|
|
91
93
|
- test/lib/codec/field_test.rb
|
|
92
94
|
- test/lib/codec/fix_test.rb
|
|
93
95
|
- test/lib/codec/pckd_test.rb
|
|
@@ -124,6 +126,7 @@ summary: This Gem provide class that permit to instantiate Codec to parse or bui
|
|
|
124
126
|
test_files:
|
|
125
127
|
- test/lib/codec/bitmap_test.rb
|
|
126
128
|
- test/lib/codec/composed_test.rb
|
|
129
|
+
- test/lib/codec/eightbits_test.rb
|
|
127
130
|
- test/lib/codec/field_test.rb
|
|
128
131
|
- test/lib/codec/fix_test.rb
|
|
129
132
|
- test/lib/codec/pckd_test.rb
|