diff --git a/Gemfile.lock b/Gemfile.lock index ec4cfcf..28241bc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,16 +1,15 @@ GEM remote: https://rubygems.org/ specs: - activesupport (4.2.2) + activesupport (5.1.5) + concurrent-ruby (~> 1.0, >= 1.0.2) i18n (~> 0.7) - json (~> 1.7, >= 1.7.7) minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) coderay (1.1.0) + concurrent-ruby (1.1.7) diff-lcs (1.2.5) i18n (0.7.0) - json (1.8.3) method_source (0.8.2) minitest (5.7.0) phone (1.2.3) diff --git a/lib/pdu_tools/decoder.rb b/lib/pdu_tools/decoder.rb index 6fffbff..7a07c19 100644 --- a/lib/pdu_tools/decoder.rb +++ b/lib/pdu_tools/decoder.rb @@ -171,6 +171,13 @@ def parse_user_data data_length @udh_length = take(2, :integer) * 2 udh = take(@udh_length) @user_data_header = parse_user_data_header udh + + if (@data_coding_scheme[:alphabet] === :a7bit) + udh_bit_length = ((@udh_length/2) + 1) * 8 + next_septet_start = ( udh_bit_length.to_f / 7 ).ceil * 7 + offset = next_septet_start > udh_bit_length ? next_septet_start - udh_bit_length : 0 + @offset_7bit = offset if offset > 1 + end end case @data_coding_scheme[:alphabet] when :a7bit diff --git a/lib/pdu_tools/helpers.rb b/lib/pdu_tools/helpers.rb index 3a53c51..7372548 100644 --- a/lib/pdu_tools/helpers.rb +++ b/lib/pdu_tools/helpers.rb @@ -84,6 +84,12 @@ def decode7bit textdata, length = nil, offset = 1 next_septet = "" last_char = "" + if offset > 1 && bytes.length + cur_septet = bytes.shift + cur_septet = cur_septet.slice( 0, cur_septet.length - offset ) + offset = cur_septet.length + 1 + end + bytes.each_with_index do |byte, index| to_take = ([0,1].include? offset) ? 7 : 8-offset cur_septet.prepend byte[offset, to_take] diff --git a/spec/decoder_spec.rb b/spec/decoder_spec.rb index 8b7ee63..5bfdfd5 100644 --- a/spec/decoder_spec.rb +++ b/spec/decoder_spec.rb @@ -31,6 +31,19 @@ expect(message_part.user_data_header[:multipart]).to be_present expect(message_part.user_data_header[:multipart][:parts]).to eq 2 expect(message_part.user_data_header[:multipart][:part_number]).to eq 1 + expect(message_part.body).to eq 'This is a test messageThis is a test messageThis is a test messageThis is a test messageThis is a test messageThis is a test messageThis is a test messa' + end + + context "with extra padding" do + let(:pdu) { "07912933035011804409D055F3DB5D060000411120712071022A080701030003990202A09976D7E9E5390B640FB3D364103DCD668364B3562CD692C1623417" } + it "should decode" do + message_part = decoder.decode + expect(message_part.user_data_header).to be_present + expect(message_part.user_data_header[:multipart]).to be_present + expect(message_part.user_data_header[:multipart][:parts]).to eq 2 + expect(message_part.user_data_header[:multipart][:part_number]).to eq 2 + expect(message_part.body).to eq 'Minutes, valid till 23-11-2014.' + end end end