PDA

View Full Version : تبدیل متن فارسی به PDU



@AM!R!
چهارشنبه 28 فروردین 1387, 18:13 عصر
سلام به همه برنامه نویسان
کسی از دوستان ابزاری برای تبدیل متن فارسی به PDU داره؟

raravaice
چهارشنبه 28 فروردین 1387, 18:51 عصر
http://barnamenevis.org/forum/showpost.php?p=484114&postcount=190

موفق باشید

@AM!R!
شنبه 31 فروردین 1387, 19:13 عصر
ممنون
کدی با vb6 ندارین؟

raravaice
شنبه 31 فروردین 1387, 19:31 عصر
نه متاسفانه

موفق باشید

@AM!R!
دوشنبه 02 اردیبهشت 1387, 12:06 عصر
دوست عزیز
مشغول نوشتن کدی هستم که با vb6 تبدیل متن به PDU را انجام می دهد
آیا با زبان vb6 آشنا هستید؟
و می توانید مرا در این خصوص یاری دهید؟
خیییییلییییی ممممنووووووون.........

noorsoft
سه شنبه 03 اردیبهشت 1387, 17:23 عصر
من به وی بی مسلط هستم شما تا کجا جلو رفتی و میخای چکار کنی

@AM!R!
چهارشنبه 04 اردیبهشت 1387, 22:17 عصر
این کد رو یه نگاه بندازید لطفا

noorsoft
جمعه 06 اردیبهشت 1387, 07:16 صبح
این تابع قبلا نوشته شده


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
جمعه 06 اردیبهشت 1387, 10:11 صبح
من کد شما را اصلاح کردم



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!
شنبه 07 اردیبهشت 1387, 13:45 عصر
دوست عزیز ممنون
اون تابع رو قبلا دیده بودم ولی همونطور که میدونید امکان استفاده از اون کلاس خاص در vb6 وجود ندارد و حتما باید در net. از اون استفاده کرد
کد جدید رو تست می کنم و بهتون اطلاع می دهم.

@AM!R!
شنبه 07 اردیبهشت 1387, 23:30 عصر
دوست عزیز سلام
همانطور که می دانید برای تبدیل متن به pdu به ازای هر 7 بایت یک بایت خالی باید رد شود و در نظر گرفته نشود ولی با کد بالا و در قسمت case else ، آن خظ خالی با 00 جایگزین می شود
که نتیجه صحیح نخواهد بود.
نظر شما چیست؟

noorsoft
یک شنبه 08 اردیبهشت 1387, 08:59 صبح
دوست عزیز ممنون
اون تابع رو قبلا دیده بودم ولی همونطور که میدونید امکان استفاده از اون کلاس خاص در vb6 وجود ندارد و حتما باید در net. از اون استفاده کرد
کد جدید رو تست می کنم و بهتون اطلاع می دهم.

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

noorsoft
سه شنبه 10 اردیبهشت 1387, 14:34 عصر
UDP چند حالت داره
7Bit - 8bit - 16 bit cus2
شما برای ارسال متنهای انگلیسی باید از 7 بیت استفاده کنین ولی برای ارسال متن فارسی از 16 بیت استفاده میشه

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

@AM!R!
سه شنبه 10 اردیبهشت 1387, 19:43 عصر
میشه لطفا برای پیغام "سلام" روش 16 بیت رو مثال بزنید
البته متن کامل با SMSC و شماره مقصد و ....
البته برای متن فارسی از 70 کاراکتر بیشتر مجاز نیست درسته؟
من گیج شدم
ممنون

noorsoft
چهارشنبه 11 اردیبهشت 1387, 09:35 صبح
دوست عزیز
برای ارسال متن فارسی شما باید از یونیکد فارسی استفاده کنید
که هر حرف از دو بایت استفاده میشه مثلا کارکتر
1 =0031
2=0032
برای همین بیشتر از 70 کارکتر نمیشه در یک قسمت ارسال کرد و اگه بیشتر بشه باید چند قسمتی ارسال بشه

@AM!R!
جمعه 13 اردیبهشت 1387, 10:45 صبح
ماژولی برای تبدیل وجود نداره
vb6
فعلا با Select case نوشتم ولی خیلی جالب نیست
مسئله بعدی اینکه اگه بخواهیم با PDU متن انگلیسی و فارسی رو با هم بفرسیم چطور؟ بازم 70 کاراکتر

noorsoft
شنبه 14 اردیبهشت 1387, 13:14 عصر
بله حتی یک کلمه فارسی هم باعث میشه شما 16 بیتی دیتاهاتونو کد کنی

@AM!R!
یک شنبه 15 اردیبهشت 1387, 12:12 عصر
پس ماژول بهینه تری برای تبدیل غیر Select Case وجود نداره؟

noorsoft
دوشنبه 16 اردیبهشت 1387, 06:22 صبح
شما به زیر برنامه ای زیر توجه کن



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
دوشنبه 16 اردیبهشت 1387, 06:26 صبح
این همه طریقه کار




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!
سه شنبه 17 اردیبهشت 1387, 10:25 صبح
با تشکر از شما دوست عزیز
برای دریافت چه پیشنهادی دارید؟
چگونه می توان فهمید، sms دریافتی با چه مدیست؟

noorsoft
چهارشنبه 18 اردیبهشت 1387, 19:11 عصر
از TP-DCS میتونی متوجه بشی

maryam_razmjooe68
شنبه 22 فروردین 1388, 16:19 عصر
سلام ممکنه یه تابه بگید در delphi که متن رو تبدیل به pdu کنه و برعکس؟