การแปลงอักขระพิเศษเป็นข้อมูล 7 บิตสำหรับสตริง PDU ใน C #

ฉันกำลังพยายามสร้างตัวเข้ารหัส PDU ซึ่งกำหนดให้ฉันต้อง:

  1. แปลงอักขระแต่ละตัวในสตริงให้เป็นค่า ASCII
  2. แปลงค่า ASCII เป็นไบนารี่ 7 บิต
  3. การใช้วิธีนี้ - การแปลง 7 บิตเป็น 8 บิต ฉันกำลังทำสิ่งนี้ในฟังก์ชันโดยใช้เซปเท็ตแรกและเพิ่มจากส่วนท้ายของเซปเท็ตถัดไปจนกระทั่งอันแรกมี 8 บิต (เหมือนที่แสดงใน url) โดยพื้นฐานแล้วจะดำเนินต่อไปตลอด
  4. การใช้ไบนารี่ 8 บิตฉันสามารถแปลงเป็น Hex สำหรับสตริง PDU ของฉันได้

ทั้งหมดนี้ใช้งานได้ดีเมื่อใช้:

  1. ASCII = Convert.ToInt32(char)
  2. Convert.ToString(ASCII, 2) = 7 บิต
  3. SeptetToOctet(7bit) = 8 บิต (ฟังก์ชันของฉัน)
  4. Convert.ToString(Convert.ToInt32(8bit, 2), 16).ToUpper() (ฉันจะเพิ่ม 0 หากแปลงเป็น 1 ตัวอักษรเท่านั้น)

ปัญหาของฉันมาถึงแล้ว เมื่อพยายามแปลงอักขระพิเศษ เช่น ภาษาเดนมาร์ก 'ø' คุณจะได้ค่า ASCII เป็น 248 ซึ่งเมื่อ Convert.ToString(248, 2) ให้ค่า 11111000 กับฉัน (8 บิต) ดังนั้นฉันต้องรู้วิธีบังคับให้แปลง 'ø' เป็นไบนารี่ 7 บิตหรือการแปลง SeptetToOctet (ซึ่งเป็นการแปลงใน URL ที่ให้ไว้) จำเป็นต้องมีการแก้ไข แต่ตอนนี้ฉันมีความรู้เพียงพอเกี่ยวกับการแปลงไบนารีและไบนารี่ที่จะรู้ จะทำให้ถูกต้องได้อย่างไร


person Daniel Olsen    schedule 12.09.2011    source แหล่งที่มา
comment
ASCII ไม่มี มี ค่า 248 ASCII เป็นการเข้ารหัส 7 บิต คุณต้องพิจารณาว่าการเข้ารหัสใดที่คุณกำลังจริงๆพูดถึง   -  person Jon Skeet    schedule 12.09.2011
comment
ฉันดูที่ MSDN และมันบอกว่า ToInt32 มีการเข้ารหัส UTF-16 ไม่ใช่ ASCII แต่เป็น UTF-16   -  person Daniel Olsen    schedule 12.09.2011
comment
char นั้นเป็นหน่วยรหัส UTF-16 โดยเนื้อแท้ คุณไม่จำเป็นต้องโทร Convert.ToInt32 เลย แต่โดยพื้นฐานแล้ว หากคุณมีอักขระที่ไม่ใช่ ASCII คุณจำเป็นต้องรู้ว่าอักขระเหล่านั้นมีความหมายอย่างไรในการนำเสนอ...   -  person Jon Skeet    schedule 12.09.2011
comment
@Jon Skeet: ตัวละครของเขาอยู่ในตัวอักษร GSM 7 บิต เพียงต้องการรหัส ASCII อีกอัน แดเนียลดูคำตอบของฉัน   -  person whosrdaddy    schedule 12.09.2011


คำตอบ (1)


แดเนียล

ดูนี่:

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

คุณต้องแปลงเป็น 0x0B หรือ 0x0C (ขึ้นอยู่กับตัวพิมพ์ใหญ่)

สร้างตารางการแปลสำหรับ 7 บิต GSM เป็น ASCII (การเข้ารหัสของคุณ) และในทางกลับกัน สิ่งนี้จะทำให้ชีวิตของคุณง่ายขึ้น

นี่คือตัวอย่างเล็ก ๆ ในเดลฟี (ฉันรู้ว่า OOP ถามหา C# แต่หลักการยังคงเหมือนเดิม)

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;

คำอธิบายเล็กๆ น้อยๆ:

v คือสตริงอินพุตดั้งเดิม อักขระแต่ละตัวจะถูกแปลงเป็นไบต์ซึ่งทำหน้าที่เป็นดัชนีสำหรับอาร์เรย์ Latin1ToGsm ซึ่งมีคู่ตัวอักษร GSM หากค่าที่ส่งคืนต่ำกว่า 0 แสดงว่าเรามีอักขระขยาย (เช่นเครื่องหมาย €) และหมายความว่าคุณต้องส่งอักขระยกเว้น (0x027) ไปด้านหน้า

แก้ไข

นี่คือลิงค์ที่อธิบายวิธีการทำใน C#: http://codeglobe.blogspot.com/2009/02/sending-sms-in-cnet-using-gsm-modem-and.html

ไชโย!

person whosrdaddy    schedule 12.09.2011
comment
นอกจากนี้ คุณสามารถใช้ชุดอักขระ UCS-2 ได้ (ที่มีความจุลดลง) - person Rowland Shaw; 12.09.2011
comment
whosrdaddy: ฉันเข้าใจแล้ว ฉันจะให้คุณให้คำแนะนำว่าฉันจะดำเนินการต่อได้อย่างไร? เพราะฉันต้องแปลง 7 บิต GSM hex นี้เป็น 8 บิตใช่ไหม ฉันแค่ลองค้นหาใน Google ซึ่งมีหลายวิธีในการทำสิ่งที่ตรงกันข้ามกับที่ฉันต้องการ แต่ไม่มีวิธีที่มีประโยชน์ในการย้อนกลับรหัส - person Daniel Olsen; 12.09.2011
comment
Shaw: วิธีแก้ปัญหาของคุณยอดเยี่ยมมาก แต่ฉันไม่ควรต้องใช้ชุดอักขระ UCS-2 - person Daniel Olsen; 12.09.2011
comment
@Daniel: ก่อนอื่นให้แปลงอักขระอินพุต ASCII ให้เป็นอักขระในตัวอักษร GSM 7 บิต (หรือที่เรียกว่า Translationtable) จากนั้นเข้ารหัสสตริงนั้นเป็นลำดับ PDU 7 บิต - person whosrdaddy; 12.09.2011
comment
ใช่ แต่การเข้ารหัส PDU 7 บิตนั้นค่อนข้างคลุมเครือสำหรับฉัน เนื่องจากตามตัวอย่างนี้: dreamfabric com/sms/hello.html - ฉันต้องการมันเป็นไบนารี 7 บิตเพื่อให้สามารถแปลงเป็นไบนารี 8 บิต จากนั้นจึงเป็นตัวแทน 8 บิตของข้อมูล 7 บิต ใช่แล้ว ฉันสามารถสร้างอาร์เรย์ที่ให้ 7 บิต GSM hex สำหรับอักขระที่กำหนดได้อย่างง่ายดาย แต่วิธีการนำเสนอแบบ 8 บิตนั้นเป็นส่วนที่ยาก - person Daniel Olsen; 12.09.2011
comment
แดเนียลส์ อักขระ ASCII ทั้งหมดแสดงด้วยไบต์ เช่นเดียวกับ 7 บิต GSM (ค่าจะไม่มากกว่า 0x7F กล่าวคือ บิตสูงสุดจะไม่ถูกตั้งค่า) คุณต้องสับเปลี่ยนบิตจากอักขระอื่น ๆ ให้เป็นสตรีม 7 บิต เริ่มต้นด้วยอักขระตัวแรก เลื่อนไปทางซ้ายเพื่อให้บิตต่ำสุดจะเป็นบิตสูงสุด (จากบิต 7) ของอักขระถัดไป - person whosrdaddy; 12.09.2011