codec 0.0.11 → 0.0.12
Sign up to get free protection for your applications and to get access to all the features.
- 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
|