سلام.
من توی Encoding مربوط به محتوای پیام مشکل دارم. کدی رو که نوشتم در زیر قرار می دم، لطفا بگین چرا به مشکل بر می خوره. مشکل اینه که همونطور که دیدیم، هر 8 کاراکتر میاد در 7 بایت می شینه. من موقع ارسال Sms ها دیدم که مثلا وقتی میفرستم Reza Mohammad حرف آخر اون که d هست فرستاده نمی شه و برای رشته های بزرگتر تعداد حرف های بیشتری فرستاده نمیشه، یعنی همون تعدادی که به خاطر PDU Encoding کم شده، مثلا توی یه رشته که 24 حرف داره 3 حرف آخر نمی رسه و ....
در ضمن من برای تبدیل باینری به هگزا دسیمال و همچنین گرفتن کد یک کاراکتر خودم تابع نوشتم، لطفا اگر این توابع توی NET2. موجود هستند بگین.
تابع شامل 6 مرحله هست :
1-پیدا کردن کد هر کاراکتر و تبدیل آن به هگزا دسیمال = Step1
2-تبدیل کدهای هگز به باینری = Step2
3-حذف MSB هر Octet که میشه Step3
4- برعکس کردن هفت تایی ها = Step4
اضافه کردن تعدادی صفر به سمت چپ رشته تا طول رشته مضرب 8 بشود
5-برعکس کردن 8 تایی ها، البته شما نوشته بودین که به هگز تبدیل می کنین و بعد برعکس می کنین که فرقی نداره، من اول هشت تایی ها رو برعکس کردم و بعد به هگز تبدیل کردم و این میشه Step5
6- تبدیل باینری ها به هگزا دسیمال، البته چون تابع Convert.ToInt16 اعداد بین یک تا 15 رو به یک رقم هگز تبدیل می کنه و ما دوتا دوتا می خواهیم، هر 4 بیت 4بیت رو جدا کردم و هگز کردم.
Function EncodeOnePartDefaultAlphabetMessage(ByVal Message AsString) AsString
Dim Step1 AsString = ""
Dim Step2 AsString = ""
Dim Step3 AsString = ""
Dim Step4 AsString = ""
Dim Step5 AsString = ""
Dim Step6 AsString = ""
Dim Result AsString = ""
Dim OS, OE AsInteger' Octet Start and Octet End Pointers
Dim Messagelen AsInteger
Messagelen = Message.Length
Dim MessageLenStr AsString = ""
Dim Octet AsString = ""
Dim Tetra AsString = ""
For i AsInteger = 0 To Message.Length - 1
Step1 += Me.GetHexadecimalCharCode_ASCII(Message.Chars(i))
Next
For i AsInteger = 0 To Step1.Length - 1
Step2 += Me.ConvertHexToBinary(Step1.Chars(i))
Next
OS = 1
OE = 7
While OE < Step2.Length
Octet = StrCpy(Step2, OS, OE)
Step3 += Octet
OS += 8
OE += 8
EndWhile
OE = Step3.Length - 1
OS = OE - 6
While OS >= 0
Octet = StrCpy(Step3, OS, OE)
Step4 += Octet
OS -= 7
OE -= 7
EndWhile
If Step4.Length Mod 8 <> 0 Then
Dim Zeros AsInteger
Zeros = 8 - (Step4.Length Mod 8)
For i AsInteger = 1 To Zeros
Step4 = "0" + Step4
Next
EndIf
OE = Step4.Length - 1
OS = OE - 7
While OS >= 0
Octet = StrCpy(Step4, OS, OE)
Step5 += Octet
OS -= 8
OE -= 8
EndWhile
OS = 0
OE = 3
While OE < Step5.Length
Octet = StrCpy(Step5, OS, OE)
Step6 += Me.ConvertBinaryToHex(Octet)
OS += 4
OE += 4
EndWhile
Dim LN AsInteger = Step6.Length / 2
If LN >= 0 And LN < 16 Then
MessageLenStr = "0" & CStr(Hex(LN))
Else
MessageLenStr = CStr(Hex(LN))
EndIf
Result = MessageLenStr & Step6
Return Result
EndFunction
****************
Function GetHexadecimalCharCode_ASCII(ByVal Character AsChar) AsString
Dim CharIndex AsInteger = -1
Dim Result AsString = ""
For i AsInteger = 0 To 255
If Chr(i) = Character Then
CharIndex = i
ExitFor
EndIf
Next
If CharIndex <> -1 Then
If CharIndex > 0 And CharIndex < 16 Then
Result = "0" + CStr(Hex(CharIndex))
ElseIf CharIndex >= 16 And CharIndex <= 255 Then
Result = CStr(Hex(CharIndex))
EndIf
EndIf
Return Result
EndFunction
فکر کنم پستم خیلی طولنی شد، ببخشید، مشکله دیگه، باید حل بشه.
با این کد چند تا خروجی رو ازش می نویسم :
String : 'Reza' => 04D2B23E0C
String : 'Reza Mohammad' => 0CD2B23E0C6ABED1E1763B4C06
String : 'This is a test sms for sending' => 1B54747A0E4ACF416110BD3CA783E6ED39C8FC9683E6653739 ED3E03
رشته اول مشکلی نداره و کامل می رسه ، رشته دوم حرف آخرش نمی رسه و رشته سوم سه حرفش نمی رسه. لطفا اگر می شه این رشته ها رو با برنامه خودتون تست کنین و خروجیتون رو با این خروجی ها مقایسه کنین و بگین اشکال کارم کجاست.