Add UCS-2 encoding / decoding for SMS user data

develop
Guillaume DOTT 2013-09-06 17:15:06 +02:00
parent 45de11cb3b
commit 955654365a
3 changed files with 50 additions and 3 deletions

View File

@ -1,9 +1,11 @@
require 'biju/pdu/gsm7bit' require 'biju/pdu/gsm7bit'
require 'biju/pdu/ucs2'
module Biju module Biju
module PDU module PDU
ENCODING = { ENCODING = {
gsm7bit: GSM7Bit, gsm7bit: GSM7Bit,
ucs2: UCS2,
} }
def self.encode(hash) def self.encode(hash)
@ -30,7 +32,8 @@ module Biju
'%S%M%H%d%m%y%Z'), '%S%M%H%d%m%y%Z'),
user_data_length: string[52..53], user_data_length: string[52..53],
} }
res[:sender_number] = string[22..(22 + res[:address_length])] res[:sender_number] = string[22..(22 + res[:address_length])].scan(/../)
.map(&:reverse).join.chop
res[:user_data] = PDU.decode_user_data(string[54..-1], res[:user_data] = PDU.decode_user_data(string[54..-1],
encoding: res[:data_coding_scheme], encoding: res[:data_coding_scheme],
length: res[:user_data_length].hex) length: res[:user_data_length].hex)
@ -41,8 +44,8 @@ module Biju
def self.decode_user_data(message, encoding: '00', length: 0) def self.decode_user_data(message, encoding: '00', length: 0)
encoding = data_coding_scheme(encoding) unless encoding.is_a?(Symbol) encoding = data_coding_scheme(encoding) unless encoding.is_a?(Symbol)
raise ArgumentError, "Unknown encoding" unless ENCODING.has_key?(:gsm7bit) raise ArgumentError, "Unknown encoding" unless ENCODING.has_key?(encoding)
ENCODING[:gsm7bit].decode(message, length: length) ENCODING[encoding].decode(message, length: length)
end end
def self.data_coding_scheme(dcs) def self.data_coding_scheme(dcs)

View File

@ -0,0 +1,14 @@
module Biju
module PDU
class UCS2
def self.decode(string, length: 0)
string.scan(/.{4}/).map { |char| char.hex.chr('UCS-2BE') }.join
.encode('UTF-8', 'UCS-2BE')
end
def self.encode(string)
string.encode('UCS-2BE').chars.map { |char| "%04x" % char.ord }.join
end
end
end
end

View File

@ -0,0 +1,30 @@
require 'spec_helper'
require 'biju/pdu/ucs2'
describe Biju::PDU::UCS2 do
describe '::decode' do
it "decodes string" do
expect(Biju::PDU::UCS2.decode('00C700E700E200E300E500E4016B00F80153', length: 4)).to eq('Ççâãåäūøœ')
end
end
describe '::encode' do
it "encodes string" do
expect(Biju::PDU::UCS2.encode('Ççâãåäūøœ').upcase).to eq('00C700E700E200E300E500E4016B00F80153')
end
end
it "gives same text after encoding and decoding" do
strings = [
'My first TEST',
'{More çomplicated]',
'And on€ More~',
'þß®',
]
strings.each do |string|
expect(Biju::PDU::UCS2.decode(
Biju::PDU::UCS2.encode(string), length: string.length)).to eq(string)
end
end
end