Mengubah karakter khusus menjadi data 7 bit untuk string PDU di C#

Saya mencoba membuat encoder PDU yang mengharuskan saya untuk:

  1. Ubah setiap karakter dalam string menjadi nilai ASCII
  2. Ubah nilai ASCII menjadi biner 7-bit
  3. Menggunakan metode ini - Mengubah 7-bit menjadi 8 bit. Saya melakukan ini dalam suatu fungsi dengan mengambil septet pertama, dan menambahkan dari akhir septet berikutnya hingga yang pertama memiliki 8 bit (seperti yang ditunjukkan di url). Ini pada dasarnya berlanjut sepanjang.
  4. Menggunakan biner 8 bit saya dapat mengonversi ke Hex untuk string PDU saya.

Semua ini berfungsi dengan baik saat menggunakan:

  1. ASCII = Convert.ToInt32(char)
  2. Convert.ToString(ASCII, 2) = 7bit
  3. SeptetToOctet(7bit) = 8bit (Fungsi saya)
  4. Convert.ToString(Convert.ToInt32(8bit, 2), 16).ToUpper() (Saya menambahkan 0 jika diubah menjadi hanya 1 karakter)

Sekarang muncul masalah saya, ketika mencoba mengonversi karakter khusus, seperti 'ø' Denmark, Anda mendapatkan nilai ASCII 248, yang dengan Convert.ToString(248, 2) memberi saya 11111000 (8 bit). Jadi saya perlu tahu cara memaksa konversi 'ø' ke biner 7 bit, atau konversi SeptetToOctet (ini konversi pada URL yang disediakan) perlu direvisi, tapi sekarang saya punya cukup pengetahuan tentang konversi biner dan biner untuk mengetahuinya bagaimana melakukannya dengan benar.


person Daniel Olsen    schedule 12.09.2011    source sumber
comment
ASCII tidak memiliki nilai 248. ASCII adalah pengkodean 7-bit. Anda perlu menentukan pengkodean mana yang sebenarnya bicarakan.   -  person Jon Skeet    schedule 12.09.2011
comment
Ya - saya melihat MSDN dan dikatakan bahwa ToInt32 menyediakan pengkodean UTF-16. Jadi bukan ASCII, tapi UTF-16   -  person Daniel Olsen    schedule 12.09.2011
comment
Ya char pada dasarnya adalah unit kode UTF-16. Anda tidak perlu menelepon Convert.ToInt32 sama sekali. Namun pada dasarnya jika Anda memiliki karakter non-ASCII, Anda perlu mengetahui cara representasinya...   -  person Jon Skeet    schedule 12.09.2011
comment
@Jon Skeet: Karakternya dalam alfabet GSM 7 bit, hanya perlu kode ascii lain. Daniel melihat jawabanku.   -  person whosrdaddy    schedule 12.09.2011


Jawaban (1)


daniel,

Lihat disini:

http://www.dreamfabric.com/sms/default_alphabet.html

Anda perlu mengonversi ke 0x0B atau 0x0C (tergantung huruf kapital)

Buat tabel terjemahan untuk GSM 7bit ke ASCII (encoding Anda) dan sebaliknya. Ini akan membuat hidup Anda lebih mudah.

Berikut contoh kecil di delphi (saya tahu OOP meminta C# tetapi prinsipnya tetap sama)

function CharsetLatin1ToGsm(v : string) : string;

var Ps,I : Integer;
    Len  : Integer;
    c    : Char;

begin
 Result := '';
 if v = '' then Exit;
 Ps := 1;
 Len := Length(v);
 while Ps <= Len do
  begin
   c := v[Ps];
   I := Latin1ToGsm[Byte(c)];
   if I < 0 then
    begin
     Result := Result+#27+Chr(-I);
    end
   else
    Result := Result+Chr(I);
   Inc(Ps);
  end;
end;

Penjelasan kecil:

v adalah string masukan asli. setiap karakter diubah menjadi byte yang berfungsi sebagai indeks untuk array Latin1ToGsm yang berisi rekanan alfabet GSM. jika nilai yang dikembalikan di bawah 0, berarti kita memiliki karakter yang diperluas (seperti tanda €) dan ini berarti Anda perlu mengirimkan karakter escape (0x027) di depan.

EDIT

berikut tautan yang menjelaskan cara melakukannya di C#: http://codeglobe.blogspot.com/2009/02/sending-sms-in-cnet-using-gsm-modem-and.html

Bersulang!

person whosrdaddy    schedule 12.09.2011
comment
Selain itu, Anda dapat menggunakan kumpulan karakter UCS-2 (dengan kapasitas yang dikurangi) - person Rowland Shaw; 12.09.2011
comment
whosrdaddy: Begitu, apakah saya bisa memberi saya petunjuk tentang bagaimana saya bisa melanjutkan? Karena saya perlu mengubah hex GSM 7bit ini ke hex 8bit? Saya baru saja mencoba mencari di Google yang memiliki banyak cara untuk melakukan kebalikan dari apa yang saya inginkan, tetapi tidak ada cara yang dapat digunakan untuk membalikkan kode. - person Daniel Olsen; 12.09.2011
comment
Shaw: Solusi Anda elegan, tapi saya tidak harus menggunakan rangkaian karakter UCS-2. - person Daniel Olsen; 12.09.2011
comment
@Daniel: pertama-tama konversikan karakter input ASCII ke karakternya dalam alfabet GSM 7bit (alias Translationtable). Kemudian kodekan string itu ke dalam urutan PDU 7bit. - person whosrdaddy; 12.09.2011
comment
Ya, tapi pengkodean PDU 7bitnya agak kabur bagi saya, karena menurut contoh ini: dreamfabric. com/sms/hello.html - Saya memerlukannya dalam biner 7 bit agar dapat mengubahnya menjadi biner 8 bit dan kemudian menjadi representasi 8 bit dari data 7 bit. Jadi ya, saya dapat dengan mudah membuat array yang menyediakan hex GSM 7bit untuk karakter tertentu. Namun bagaimana cara mewujudkannya menjadi representasi 8 bit adalah bagian yang sulit. - person Daniel Olsen; 12.09.2011
comment
Daniels, semua karakter ASCII diwakili oleh satu byte. begitu juga dengan GSM 7bit (nilainya tidak akan pernah lebih besar dari 0x7F, yaitu bit tertinggi tidak akan pernah disetel). Anda perlu mengacak bit dari karakter lain ke dalam aliran 7bit. Mulailah dengan karakter pertama, geser ke kiri sehingga bit terendah menjadi bit tertinggi (dari bit 7) karakter berikutnya. - person whosrdaddy; 12.09.2011