# Native Code > برنامه نویسی موبایل > Symbian OS >  تبدیل متن فارسی به PDU

## @AM!R!

سلام به همه برنامه نویسان
کسی از دوستان ابزاری برای تبدیل متن فارسی به PDU داره؟

----------


## raravaice

https://barnamenevis.org/showpo...&postcount=190

موفق باشید

----------


## @AM!R!

ممنون
کدی با vb6 ندارین؟

----------


## raravaice

نه متاسفانه

موفق باشید

----------


## @AM!R!

دوست عزیز
مشغول نوشتن کدی هستم که با vb6 تبدیل متن به PDU را انجام می دهد
آیا با زبان vb6 آشنا هستید؟
و می توانید مرا در این خصوص یاری دهید؟
خیییییلییییی ممممنووووووون.........

----------


## noorsoft

من به وی بی مسلط هستم شما تا کجا جلو رفتی و میخای چکار کنی

----------


## @AM!R!

این کد رو یه نگاه بندازید لطفا

----------


## noorsoft

این تابع قبلا نوشته شده

Private Function GetPDU(ByVal ServiceCenterNumber As String, _
                        ByVal DestNumber As String, _
                        ByVal DataCodingScheme As ENUM_TP_DCS, _
                        ByVal ValidPeriod As ENUM_TP_VALID_PERIOD, _
                        ByVal MsgReference As Integer, _
                        ByVal StatusReport As Boolean, _
                        ByVal UserData As String) As String()
        'Check for SMS type
        Dim Type As Integer '0 for SMS;1 For ConcatenatedShortMessage
        Dim Result() As String
        SMSObject = New SMS1.Encoder.SMS1
        Select Case DataCodingScheme
            Case ENUM_TP_DCS.DefaultAlphabet
                If txtUserData.TextLength > 160 Then
                    SMSObject = New SMS1.Encoder.ConcatenatedShortMessage
                    Type = 1
                End If
            Case ENUM_TP_DCS.UCS2
                If txtUserData.TextLength > 70 Then
                    SMSObject = New SMS1.Encoder.ConcatenatedShortMessage
                    Type = 1
                End If
        End Select

        With SMSObject
            .ServiceCenterNumber = ServiceCenterNumber
            If StatusReport = True Then
                .TP_Status_Report_Request = SMS.SMS1.Encoder.SMS1.ENUM_TP_SRI.Request_SMS_Repo  rt
            Else
                .TP_Status_Report_Request = SMS.SMS1.Encoder.SMS1.ENUM_TP_SRI.No_SMS_Report
            End If
            .TP_Destination_Address = DestNumber
            .TP_Data_Coding_Scheme = DataCodingScheme
            .TP_Message_Reference = CInt(0) 'message refrence
            .TP_Validity_Period = ValidPeriod
            .TP_User_Data = UserData
        End With

        If Type = 0 Then
            ReDim Result(0)
            Result(0) = SMSObject.GetSMSPDUCode
        Else
            Result = SMSObject.GetEMSPDUCode            'Note here must use GetEMSPDUCode to get right PDU codes
        End If
        Return Result
    End Function

----------


## noorsoft

من کد شما را اصلاح کردم 


Option Explicit
Dim i As Integer
'
Dim BinArray(1 To 166) As String * 8
Dim BIN_PDU_ARRAY(166) As String * 8

Dim PDUMessage As String

Private Sub Command1_Click()
   'PDU Mode
    
    BinConverter
    ShiftBinary
    HexConverter
    txtMobil.Text = ""
    txtMobil.Text = PDUMessage

End Sub

Sub BinConverter()
   Dim StrTemp As String
   List1.Clear
   For i = 1 To Len(txtmessage)
       StrTemp = Get_Binary(Asc(Mid(txtmessage, i, 1)))
       BinArray(i) = Right(StrTemp, 7)
       List1.AddItem BinArray(i)
   Next i
   Label2.Caption = List1.ListCount
End Sub

Sub ShiftBinary()

   Dim temp1 As String * 7, temp2 As String * 7
   Dim BinChr As String * 8
   Dim Ipos, Pl As Integer

   Ipos = 1
   Pl = 1
   List2.Clear

   For i = 1 To Len(txtmessage) - 1
           If Ipos = 8 Then Ipos = 1
           If Pl Mod 8 = 0 Then Pl = Pl + 1

           temp1 = Trim(BinArray(Pl))
           If i < Len(txtmessage) - 1 Then
                temp2 = Trim(BinArray(Pl + 1))
                BinChr = Right(Trim(temp2), Ipos) & Trim(temp1)
                BIN_PDU_ARRAY(Pl) = BinChr
                List2.AddItem BIN_PDU_ARRAY(Pl)
                Pl = Pl + 1
                Ipos = Ipos + 1
           Else
                Ipos = Ipos - 1
                BinChr = Trim(Left(Trim(BinArray(Len(txtmessage))), 7 - Ipos))
                If Len(Trim(BinChr)) < 8 Then
                   BinChr = String(8 - Len(Trim(BinChr)), "0") & BinChr
                End If
                BIN_PDU_ARRAY(Pl) = BinChr
                List2.AddItem BIN_PDU_ARRAY(Pl)
            End If
   Next
   Label3.Caption = List2.ListCount
End Sub

Sub HexConverter()

   Dim Cnt As Integer
   Dim L, R As String
   
   PDUMessage = ""
   For Cnt = 1 To Len(txtmessage)
               L = BinToHex(Left(Trim(BIN_PDU_ARRAY(Cnt)), 4))
               R = BinToHex(Right(Trim(BIN_PDU_ARRAY(Cnt)), 4))
               PDUMessage = PDUMessage & L & R
   Next

End Sub

Function BinToHex(exp As String) As String
   Select Case exp
       Case "0001": BinToHex = Hex(1)
       Case "0010": BinToHex = Hex(2)
       Case "0011": BinToHex = Hex(3)
       Case "0100": BinToHex = Hex(4)
       Case "0101": BinToHex = Hex(5)
       Case "0110": BinToHex = Hex(6)
       Case "0111": BinToHex = Hex(7)
       Case "1000": BinToHex = Hex(8)
       Case "1001": BinToHex = Hex(9)
       Case "1010": BinToHex = Hex(10)
       Case "1011": BinToHex = Hex(11)
       Case "1100": BinToHex = Hex(12)
       Case "1101": BinToHex = Hex(13)
       Case "1110": BinToHex = Hex(14)
       Case "1111": BinToHex = Hex(15)
       Case Else:   BinToHex = Hex(0)
   End Select
End Function

Private Sub Form_Load()
   txtmessage.Text = "سلام و خسته نباشید."
End Sub

----------


## @AM!R!

دوست عزیز ممنون
اون تابع رو قبلا دیده بودم ولی همونطور که میدونید امکان استفاده از اون کلاس خاص در vb6 وجود ندارد و حتما باید در net. از اون استفاده کرد
کد جدید رو تست می کنم و بهتون اطلاع می دهم.

----------


## @AM!R!

دوست عزیز سلام
همانطور که می دانید برای تبدیل متن به pdu به ازای هر 7 بایت یک بایت خالی باید رد شود و در نظر گرفته نشود ولی با کد بالا و در قسمت case else ، آن خظ خالی با 00 جایگزین می شود
که نتیجه صحیح نخواهد بود.
نظر شما چیست؟

----------


## noorsoft

> دوست عزیز ممنون
> اون تابع رو قبلا دیده بودم ولی همونطور که میدونید امکان استفاده از اون کلاس خاص در vb6 وجود ندارد و حتما باید در net. از اون استفاده کرد
> کد جدید رو تست می کنم و بهتون اطلاع می دهم.


بله با دات نت نوشته شده

----------


## noorsoft

UDP  چند حالت داره
7Bit - 8bit - 16 bit cus2
شما برای ارسال متنهای انگلیسی باید از 7 بیت استفاده کنین ولی برای ارسال متن فارسی از 16 بیت استفاده میشه 

اگه متن شما از 166 کارکتر کمتره میتونین 8بیت ارسال کنی که در این صورت نیازی به شیفت بیتها نداری

----------


## @AM!R!

میشه لطفا برای پیغام "سلام" روش 16 بیت رو مثال بزنید
البته متن کامل با SMSC و شماره مقصد و ....
البته برای متن فارسی از 70 کاراکتر بیشتر مجاز نیست درسته؟
من گیج شدم
ممنون

----------


## noorsoft

دوست عزیز 
برای ارسال متن فارسی شما باید از یونیکد فارسی استفاده کنید
که هر حرف از دو بایت استفاده میشه مثلا کارکتر
 1 =0031
 2=0032
برای همین بیشتر از 70 کارکتر نمیشه در یک قسمت ارسال کرد و اگه بیشتر بشه باید چند قسمتی ارسال بشه

----------


## @AM!R!

ماژولی برای تبدیل وجود نداره
vb6 
فعلا با Select case نوشتم ولی خیلی جالب نیست
مسئله بعدی اینکه اگه بخواهیم با PDU متن انگلیسی و فارسی رو با هم بفرسیم چطور؟ بازم 70 کاراکتر

----------


## noorsoft

بله حتی یک کلمه فارسی هم باعث میشه شما 16 بیتی دیتاهاتونو کد کنی

----------


## @AM!R!

پس ماژول بهینه تری برای تبدیل غیر Select Case وجود نداره؟

----------


## noorsoft

شما به زیر برنامه ای زیر توجه کن


Private Function EncodeUserData(ByVal strUserData As String) As String

    Dim res As String, res2 As String, encSMS As String, lenEmNr As Long, lenSMS As Long
    Dim encRecNr As String, intNrPrefix As String
    Dim i As Long
   
   lenSMS = Len(strUserData)
   
    'Convert to 7-bit bitstream, reverse bits
    For i = 0 To Len(strUserData) - 1
        res = res + StrReverse(Bin(CLng(Asc(Mid$(strUserData, i + 1, 1))), 7))
    Next i
   
    'Check whether the string length can be divided by 8 without fractions.
    i = Len(res) And 7
    If i <> 0 Then
        res = res & String(8 - i, "0")
    End If
   
    For i = 0 To Len(res) - 1 Step 8
        res2 = StrReverse(Mid$(res, i + 1, 8))
        encSMS = encSMS & Hex(BinToDec(Left$(res2, 4))) & Hex(BinToDec(Right$(res2, 4)))
    Next i
   
    encSMS = Right$("00" & Hex(lenSMS), 2) & encSMS
    
    EncodeUserData = encSMS
End Function

----------


## noorsoft

این همه طریقه کار



0 6 5 4 3 2 1 0   1 0 6 5 4 3 2 1   2 1 0 6 5 4 3 2   3 2 1 0 6 5 4 3   4 3 2 1 0 6 5 4   5 4 3 2 1 0 6 5   6 5 4 3 2 1 0 6         6 5 4 3 2 1 0   6 5 4 3 2 1 0   6 5 4 3 2 1 0   6 5 4 3 2 1 0   6 5 4 3 2 1 0   6 5 4 3 2 1 0   6 5 4 3 2 1 0   6 5 4 3 2 1 0

----------


## @AM!R!

با تشکر از شما دوست عزیز
برای دریافت چه پیشنهادی دارید؟
چگونه می توان فهمید،  sms دریافتی با چه مدیست؟

----------


## noorsoft

از TP-DCS میتونی متوجه بشی

----------


## maryam_razmjooe68

سلام ممکنه یه تابه بگید در delphi  که متن  رو تبدیل به pdu کنه و برعکس؟

----------

