Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: Zamiana lancucha ASCII
Icewall




Typ: neutral
Postów: 10
Zarejestrowany: Aug 2004
Zamiana lancucha ASCII

Witam
Mam pewien problem z zamiana lancucha ASCII na String.Chcem aby caly lancuch zamienial sie automatycznie na Chr np. 779711499105110 rezultatem tej zamiany powinien byc wyraz Marcin.Napisalem
kod ktory nie dziala zbyt poprawnie :
Private Sub Command4_Click()
dim z
dim y
dim obciety
x = 1
z = 2
Do While Not (x = 16)
obciety = Mid(Text2.Text, x, z)
If Chr(obciety) = Chr(11) Then
z = 3
End If
If Chr(obciety) <> Chr(11) Then
x = x + z
z = 2
Text3.Text = Text3.Text + Chr(obciety)
End If
Loop
End Sub
Rezultatem konwersji 779711499105110 na chr przy urzyciu tego kodu to Marc|3| ;/ .


_____________________________________________
+==Power of the Mind==+

09-10-2004 13:51
Pokaż profil Icewall  Wyślij email do Icewall        1567198
bisiek




Typ: neutral
Postów: 487
Zarejestrowany: Jul 2003

Sprawdź ile wynosi asc("i". Jest to 105, jak zauważyłem z działania programu, to maksymalny dopuszczany numer programu to 99, przy setce poprzedni znak będzie mieć numer Asc o jeden większy od poprzedniego (+1), a ten o numerze 100 będzie mieć numer 0 (00).


_____________________________________________
www.mob.abc.pl - moja strona o VB

09-10-2004 15:31
Pokaż profil bisiek  Wyślij email do bisiek   Odwiedź stronę bisiek       3380672
bisiek




Typ: neutral
Postów: 487
Zarejestrowany: Jul 2003

Można to zrobić np. takim sposobem, ale długość zakodowanego ciągu jest mocno ograniczona.

'Kodowanie
a = Text2.Text
For i = 1 To Len(a)
b = b + Asc(Mid$(a, i, 1)) * 256 ^ (i - 1)
Next
MsgBox b

'dekodowanie
bb = b
Do
DoEvents
c = (bb / 256 - Int(bb / 256)) * 256
bb = Int(bb / 256)
Text3.Text = Text3.Text & Chr$(c)
If bb = 0 Then Exit Do
Loop


_____________________________________________
www.mob.abc.pl - moja strona o VB

09-10-2004 15:36
Pokaż profil bisiek  Wyślij email do bisiek   Odwiedź stronę bisiek       3380672
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Function Zakoduj(sInput As String) As String
    Dim cChar As Integer
    Dim sAppend As String
   
    For cChar = 1 To Len(sInput)
        sAppend = Asc(Mid$(sInput, cChar, 1))
        sAppend = Space$(3 - Len(sAppend)) & sAppend
        Zakoduj = Zakoduj & sAppend
    Next
End Function

Function Odkoduj(sInput As String) As String
    Dim cChar As Integer
    Dim sCode As String
   
    For cChar = 1 To Len(sInput) Step 3
        sCode = Mid$(sInput, cChar, 3)
        Odkoduj = Odkoduj & Chr$(Val(sCode))
    Next
End Function


[Post edytowany dnia 09-10-2004 20:19 przez marcin_an]


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

09-10-2004 20:19
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
Icewall




Typ: neutral
Postów: 10
Zarejestrowany: Aug 2004

Bisiek:.

Sprawdź ile wynosi asc("i". Jest to 105, jak zauważyłem z działania programu, to maksymalny dopuszczany numer programu to 99, przy setce poprzedni znak będzie mieć numer Asc o jeden większy od poprzedniego (+1), a ten o numerze 100 będzie mieć numer 0 (00).

Program nie ogranicza sie do wartosci ascii z przedzialu 0-99 "If Chr(obciety) = Chr(11) Then
z = 3",jezeli tak by bylo wylozyl by sie na "r"(114) ;].
marcin_an:
Funkcja dekodujaca z tego co widze ma wade poniewaz
nie bierze pod uwage wartosci 2 pozycjowych , for ma ustawiony skok co 3 .
------------------------------
Problem nadal aktualny


_____________________________________________
+==Power of the Mind==+

09-10-2004 21:33
Pokaż profil Icewall  Wyślij email do Icewall        1567198
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Owszem, bierze. Najpierw sprawdź (uruchom), potem oceniaj. Nigdy odwrotnie.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

09-10-2004 21:46
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
Icewall




Typ: neutral
Postów: 10
Zarejestrowany: Aug 2004

Hym...Wywoluje twoja funkcje tak:
Private Sub Command1_Click()
Text1.Text = dekoduj("779711499105110"
End Sub
i runtime 5 ;/ .
Modyfikulowalem funkcje ,ale nie moglem pozbyc sie problemu.


_____________________________________________
+==Power of the Mind==+

09-10-2004 22:48
Pokaż profil Icewall  Wyślij email do Icewall        1567198
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Sorry, nie odpowiadam za błędy użytkowników.
Najpierw sprawdź, czy podawane przez ciebie dane wogóle mają jakikolwiek sens. Funkcja zakoduj nigdy nie zwróci ci "779711499105110", bo nie ma takiego tekstu, który dałoby się tak zapisać.. no chyba, że znasz znaki o kodach 779, 711 i 499...


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

09-10-2004 23:06
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
Icewall




Typ: neutral
Postów: 10
Zarejestrowany: Aug 2004

Dlatego napisalem ci ze twoja funkcja jest niedokladna..


_____________________________________________
+==Power of the Mind==+

09-10-2004 23:09
Pokaż profil Icewall  Wyślij email do Icewall        1567198
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Nie moja funkcja jest niedokładna, tylko ty podajesz bezsensowne dane.

Co mam zrobić? Funkcję, która będzie dodawała nieistniejące znaki?

[Post edytowany dnia 09-10-2004 23:36 przez marcin_an]


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

09-10-2004 23:36
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
Icewall




Typ: neutral
Postów: 10
Zarejestrowany: Aug 2004

Funkcja mam przeanalizowac np. ten lancuch 779711499105110 wartosc po wartosci czyli jezeli wezmie 77 i zamieni na chr to jezeli chr(77)<>chr(11) wtedy ma dodac znak,jezeli wynikiem bedzie chr(11) ma zwiekszyc dlugosc sprawdzanej wartosci(przy ASCII trzy pozycyjnych).
Jezeli jeszcze cos jest nie jasne prosze pisac


_____________________________________________
+==Power of the Mind==+

09-10-2004 23:44
Pokaż profil Icewall  Wyślij email do Icewall        1567198
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Drobne nieporozumienie .
Już rozumiem o co ci chodzi.
Otóż twoja funkcja nie działa, bo masz złe założenia. Jesli będzie robić tak jak mówisz, to będzie obsługiwała tylko znaki z zakresów:
0-10, 12-99, 110-119.
Tak więc masz wyłączone od "d" do "m" i od "x" w górę.

Jeśli tekst był "Marcin", to piąta litera to "i", nie ma jej w zakresie obsługiwanych przez twoją funkcję.

Jesli zmienimy troszkę założenia, to da się napisać funkcję i wygląda tak:
Function Odkoduj(sInput As String) As String
    Dim nReadPointer As Long
    Dim nStrLen As Long
    Dim sBuffer As String
   
    nReadPointer = 1
    nStrLen = Len(sInput) + 1
    Do Until nReadPointer = nStrLen
        sBuffer = Mid$(sInput, nReadPointer, 2)
        If Val(sBuffer) < 26 Then
            sBuffer = Mid$(sInput, nReadPointer, 3)
            Odkoduj = Odkoduj & Chr(Val(sBuffer))
            nReadPointer = nReadPointer + 3
        Else
            Odkoduj = Odkoduj & Chr(Val(sBuffer))
            nReadPointer = nReadPointer + 2
        End If
    Loop
End Function


Uwaga: Funkcja nie sprawdza, czy ciąg znaków jest prawidłowy, wiec jeśli np. na końcu znajdzie się "11" "i początek wartosci bedzie przypadał na początek tych znaków), to funkcja bedzie nadal próbowała traktować to jako wersję 3-znakową i się poprostu wykrzaczy. Ale to tylko w przypadku, gdy ciag znaków będzie błędny.

[Post edytowany dnia 10-10-2004 01:25 przez marcin_an]


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

10-10-2004 01:22
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
Piotr T




Typ: neutral
Postów: 176
Zarejestrowany: May 2004

No to może tak...
Function Odkoduj(Data As String) As String
' deklaracje zmiennych
Dim Tekst As String
Dim G As Integer
Dim LICZ As Integer

LICZ = 1 ' ustawienie licznika

Do Until LICZ = Len(Data) + 1
    ' wycinek trzech znaków zawsze w celu sprawdzenia
    ' czy liczba trzyznakowa nie jest większa od 255
    G = Val(Mid(Data, LICZ, 3))
   
    ' teraz jeśli zmienna G będzie większa od 2
    ' to tniemy tylko  dwa znaki, jeśli nie to standartowo
    ' tniemy trzy znaki, gdyż liczba będzie się wtedy
    ' zawierać między 100 a 255
    If Left(G, 1) > 2 Then
        G = Val(Mid(Data, LICZ, 2))
        LICZ = LICZ + 2
    Else
        G = Val(Mid(Data, LICZ, 3))
        ' tu sprawdzamy liczby jedno lub dwuznakowe na
        ' końcu i jeśli owe liczby będą mniejsze
        ' od 65 (literka A) to wyskok z pętli i
        ' przekazanie wyniku do zmiennej Odkoduj
        If G < 65 Then Exit Do
        LICZ = LICZ + 3
    End If
    ' doklejanie znaków
    Tekst = Tekst & Chr(G)
Loop

    Odkoduj = Tekst
End Function



_____________________________________________
Visual Basic.NET - Mercedes dla programistów

10-10-2004 12:13
Pokaż profil Piotr T  Wyślij email do Piotr T   Odwiedź stronę Piotr T  
Icewall




Typ: neutral
Postów: 10
Zarejestrowany: Aug 2004

Wielkie thenx all.
Kod Piotra T dziala jak nalezy


_____________________________________________
+==Power of the Mind==+

10-10-2004 21:18
Pokaż profil Icewall  Wyślij email do Icewall        1567198
Wszystkich odpowiedzi: 13 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1