Jag försöker skapa en sträng som innehåller CHR(0) (NULL). Testa att på lämpligt ställe göra tmpStr = Replace(tmpStr,Chr$(0),Chr$(32)) 'mellanslag Jag provade detta och det fungerade inte... Jag måste ha ett NULL-värde i strängen, annars så läses det inte rätt i progrmmet när det skall dekrypteras. mmm... det blir lurigt,men det måste gå att komma förbi. Testa att använda nedanstående, sen byter du ut lite data efteråt. Här blir den 120st chr(0). Mittåt det måste vara 6 st " ex Label1.Caption = """""" chr(34) är ju " Beträffande Pelles förslag så vill jag ha det så här. Inga ASP trix här Ang Asc och 34 <b>tmpStr = Replace(tmpStr,Chr$(0),Chr$(34) & Chr$(34)) 'tomsträng</b> Så här ser koden ut: Problemet består i följande: Hej! <b>Ang tmpStr = Replace(tmpStr, Chr(0), "")</b> Nej, nej... "Provkörde din funktion med "Drottninggatan 2C", som du skrev ovan. Tjaa du... Om jag kör funktionen så får jag bara "", om jag kör strString1 = Chr(101) & Chr(0) & Chr(102) så får jag "e Låter konstigt att samma kod ska prestera olika resultat. Nog e det skumt allt... OK! Skall ta och installera VB 6 på min burk och se hur det fungerar... Kan bli intressant. Tyckte det var underhållande att analysera din kod. Fortsatte att experimentera. Fick ut det här <b>"Åôòoùôdödñì îü_AO²w?µ? ?1ûÿ????"</b> Nu har jag experimenterat så mycket så jag börjar bli yr i skallen. Snubblade på det här i hjälpen: Sven! Där ser man,visste inte att man kan använda ChrW$ i VB Länken till programmet fungerer ikke. :-( Upptäckte det. :-) >Det enda som jag tänkte på är messageboxarna som poppar upp hela tiden, <b>> Sven: Niklas: Joodååå kära Niklas ,(nu är det inte mig du har polemik med) men ändå Jag har egentligen aldrig testat mitt program fullt ut. Sven: Woooow vad glad jag blir.Har egentligen aldrig testat på detta vis. Kul att du blev så glad, varsegod. Vilken klippa ! Nu får man lära sig ! Braaaaaaaaaaaaaaaaaaaaaaaaaaaa ! Testade själv nu bara för att kolla. Varför blir det så här ? Lustigt.. Problemet är löst. Lägga till CHR(0) i en sträng
VB vägrar visa en sträng som innehåller NULL.
ex:
strString1 = Chr(0) & Chr(101)
strString2 = Chr(102) & strString1
Detta ger i variabellistan:
strString1 = ""
strString2 = "f
Bakgrunden är följande, en person har krypterat text och lagt in den i en Accessdatabas, principen har varit att lägga på 128 + tecknets position i strängen. Om resultatat har blivit 256 så har han skrivit NULL. Detta har fungerat fint men Access vägrar visa detta i sina celler, det går att plocka ut datan genom ett recordset.
Någon som har en lösning på detta?
/AndreasSv: Lägga till CHR(0) i en sträng
eller något annat tecken du finner lämpligt.Om en Label eller TextBox mfl. träffar på Chr$(0)
stoppar utskriften där.
Obs "" (tomsträng) är inte det samma som Chr$(0).Sv:Lägga till CHR(0) i en sträng
/AndreasSv: Lägga till CHR(0) i en sträng
Har du testat tmpStr = Replace(tmpStr,Chr$(0),""""") 'tomsträng 4 st "Sv:Lägga till CHR(0) i en sträng
Dim x as string
x = Space(120, chr(0))Sv:Lägga till CHR(0) i en sträng
tmpStr = Replace(tmpStr,Chr$(0),"""""") '6 "Sv:Lägga till CHR(0) i en sträng
testa replace(mystring, chr(0), chr(32)) och se vad det ger..Sv:Lägga till CHR(0) i en sträng
Dim x As String
x = Space$(120, Chr$(0)) Sv: Lägga till CHR(0) i en sträng
Ahaaa.... då skulle jag testa
tmpStr = Replace(tmpStr,Chr$(0),Chr$(34) & Chr$(34)) 'tomsträngSv:Lägga till CHR(0) i en sträng
Nu vet jag inte riktigt vad det är du försöker få till, men tmpStr kommer i alla fall inte att bli tom.
Om det är det du försöker få till så behövs väl bara:
<code>
tmpStr = Replace(tmpStr, Chr(0), "")
</code>
Eller har jag missförstått nått?
ThomasSv: Lägga till CHR(0) i en sträng
<code>
public Function EnCrypt(ByVal inData As String) As String
Dim base As Integer
Dim i As Integer
Dim intTest As Integer
Dim strBuffer As String
Dim strTestLetter As String
Dim position As Integer
Dim strNull As Boolean
base = 128
inData = Trim(inData)
If inData = "" Then
inData = ""
Exit Function
End If
For i = 1 To Len(inData)
strTestLetter = Mid(inData, i, 1)
intTest = Asc(strTestLetter)
If intTest > 128 Then
intTest = (intTest + base + i) - 256
Else
intTest = intTest + (base + i)
End If
If intTest > 256 Then
intTest = intTest - (256 + position)
If intTest < 1 Then
intTest = intTest + 256
End If
ElseIf intTest = 256 Then
intTest = 0
End If
If intTest = 0 Then
strBuffer = strBuffer & "rumpa"
strNull = True
Else
strBuffer = strBuffer & Chr(intTest)
End If
Next
If strNull Then
strBuffer = Replace(strBuffer, "rumpa", Chr(0))
End If
EnCrypt = strBuffer
End Function
</code>
Exempel på en sträng som skall krypteras är Drottninggatan 2C "t" blir då ASCII 0 och efter det så läggs det inte till något mer på den strängen. Som ni ser så har jag provat att ersätta en sträng i efterhand med Replace men det fungerar inte heller.
På något sätt har ju den som har gjort det andra programmet lyckats att skriva ett NULL-värde till databasen.
/AndreasSv:Lägga till CHR(0) i en sträng
1. Du vill ha CHR(0) i en sträng.
2. CHR(0) är strängavslutningstecken, dvs. om ett program ser tecknet chr(0) i en sträng anser den att strängen är slut. Detta är en gammal kvarleva från C, för att slippa ta med strängens längd överallt, men ändå ha ett säkert sätt att veta när den är slut. VB använder samma metod, men sparar också längden. Hängslen och livrem så att säga. Detta krånglar till det en del, men det primära problemet är just detta.
3. Lösningen ligger troligtvis i något i stil med att istället skriva till en ByteArray, eller en array med String *1, eller dylikt.Sv:Lägga till CHR(0) i en sträng
Provkörde din funktion med "Drottninggatan 2C", som du skrev ovan.
Fick "Åôòøùôðöðñì îü¯ÂÔ" tillbaka.
17 tecken in och 17 tecken ut, verkar ok, eller...?
//HåkanSv: Lägga till CHR(0) i en sträng
Så kan man inte skriva med mindre än man innesluter det i 6 st "
tmpStr = Replace(tmpStr, Chr(0),"""""") dvs du skriver en tomsträng inom citationstecken.
Chr$(34) & Chr$(34) blir samma sak.Men ! jag är inte säker på att det löser ditt problem.Sv:Lägga till CHR(0) i en sträng
Det är inget konstigt, läs mitt inlägg ovan. Strängen betraktas helt enkelt som slut där \0 ligger.
Antingen måste man ändra hela krypteringsmetoden (för övrigt inte så dum ide i det här fallet - finns ju väsentligt mycket bättre krypteringar), eller så får man försöka peta in NULL på något sätt. I princip är det genom att berätta att man har en fix längd på strängen så att det efter NULL kommer med också.Sv: Lägga till CHR(0) i en sträng
Fick "Åôòøùôðöðñì îü¯ÂÔ" tillbaka.
17 tecken in och 17 tecken ut, verkar ok, eller...?
//Håkan"
Då kommer den stora frågan.... Hur lyckades du? När jag kör så slutar den lägga till värden i strBuffer efter NULL-värdet.
/AndreasSv:Lägga till CHR(0) i en sträng
Jag klistrade in din funktion i ett project, och anropade den med "Drottninggatan 2C".
Vad får du för sträng tillbaka?
När jag kör "strString1 = Chr(0) & Chr(101)" så får jag " e".
Du fick "", eller?
Tog även bort "rumpa" biten och det blir samma.
//HåkanSv: Lägga till CHR(0) i en sträng
Sv:Lägga till CHR(0) i en sträng
Får en att fundera på miljö/omgivning/inställningar etc.
Vad använder du för VB version, vilket service pack, OS mm.
Bara chansar "vilt", kan inte ge någon förklaring till det.
Det är så grundläggande saker så det borde inte skilja.
Undrar vad andra får ut, om de skulle köra din kod?
//HåkanSv: Lägga till CHR(0) i en sträng
Jag kör Win 2000 SP4, Visual Studio 2003 (7.1.3088)
Vi kan ju hoppas att någon annan som läser kan köra funktionen ovan och se vad de får för resultat.
/AndreasSv:Lägga till CHR(0) i en sträng
Vissa skillnader finns ju.
Jag har XP SP2, VB 6.0 SP6.
Här tror jag att utvecklingsmiljön spelar roll.
//HåkanSv: Lägga till CHR(0) i en sträng
Sv:Lägga till CHR(0) i en sträng
Koden ser ut som "vanlig" vb kod.
Har inte varit inne i VB.NET så jag vet inte hur det ser ut där.
Det blir bara "gamla" VB 6.0 när det vankas VB för mig.
Men har du använt VS 2003, och kört det som "äldre" vb.
Eller kör du det som ett VB.NET.
EDIT: Såg nu att man kan öppna ett consol project i VB.NET,
som verkar se ut ung. som tidigare.
Ska testa det och se vad som händer.
EDIT IGEN: Fick samma reultat som i VB 6.0.
//HåkanSv: Lägga till CHR(0) i en sträng
Så här blev min lösning ,utan att göra anspråk på att den är riktig.
Något som konfunderar mig är att du använder Ascii 256 som inte finns
ANSI kod går från 0 - 255
<code>
Option Explicit
Private Sub Command1_Click()
MsgBox EnCrypt("Drottningatan 2 C") '17 tecken Ok
End Sub
Public Function EnCrypt(ByVal inData As String) As String
'krypterad sträng får inte innehålla mer än 17 tecken
Dim base As Long
Dim i As Long
Dim ascTest As Long
Dim strBuffer As String
Dim outStr As String
base = 128
inData = Trim$(inData)
strBuffer = String$(80, Chr$(0))
'Jag fattar inte varför jag måste begränsa till 17 tecken
If inData = "" Or Len(inData) > 17 Then Exit Function
For i = 1 To 80
Mid$(strBuffer, i, 1) = Mid$(inData, i, 1)
Next
'Ta bort Null-tecken
If InStr(strBuffer, Chr$(0)) Then _
strBuffer = Left$(strBuffer, InStr(strBuffer, Chr$(0)) - 1)
For i = 1 To Len(strBuffer)
ascTest = Asc(Mid$(strBuffer, i, 1))
ascTest = ascTest + base + i
outStr = outStr & Chr$(ascTest)
Next 'i
EnCrypt = outStr
End Function
</code>
Om du vill Dekrypter så ändra denna rad
<code>
ascTest = ascTest + base + i
</code>
Till
<code>
ascTest = ascTest - base - i
</code>Sv:Lägga till CHR(0) i en sträng
Finns det någon som begriper varför koden bara klarar inData 17 tecken ?
Om det är Ok för dig har jag en bättre enkel algoritm för EnKrypt och Dekrypt som funkar ;-)Sv: Lägga till CHR(0) i en sträng
från <b>"Drottninggatan 2C är min adress"</b>.
31 tecken som indata.
Verkar inte vara någon reservation på antal intecken.
Vad händer efter 17 tecken för dig Sven?
//HåkanSv:Lägga till CHR(0) i en sträng
Om jag enl denna kod skickar mer än 17 tecken,(kolla 18) har inte testat 31
så får jag Error ???
<code>
Option Explicit
Private Sub Command1_Click()
MsgBox EnCrypt("Drottningatan 2 C") '17 tecken Ok
End Sub
Public Function EnCrypt(ByVal inData As String) As String
'krypterad sträng får inte innehålla mer än 17 tecken
Dim base As Long
Dim i As Long
Dim ascTest As Long
Dim strBuffer As String
Dim outStr As String
base = 128
inData = Trim$(inData)
strBuffer = String$(80, Chr$(0))
'If inData = "" Or Len(inData) > 17 Then Exit Function
If inData = "" Then Exit Function
For i = 1 To 80
Mid$(strBuffer, i, 1) = Mid$(inData, i, 1)
Next
'Ta bort Null-tecken
If InStr(strBuffer, Chr$(0)) Then _
strBuffer = Left$(strBuffer, InStr(strBuffer, Chr$(0)) - 1)
For i = 1 To Len(strBuffer)
ascTest = Asc(Mid$(strBuffer, i, 1))
ascTest = ascTest + base + i
outStr = outStr & Chr$(ascTest)
Next 'i
EnCrypt = outStr
End Function
</code>
Lite yr i mössan kanske det finns ascTest nr som inte funkar ???Sv: Lägga till CHR(0) i en sträng
<b>Robust Programming
Null characters (equivalent to Chr(0)) in the string will lead to unexpected results when using the string.
The null character will be included with the string,
but characters following the null character will not be displayed in some situations.</b>
//HåkanSv:Lägga till CHR(0) i en sträng
Fattade inte att det var din kod det gällde med 17 tecken som max indata.
Provkörde den, och den small då ascTest fick värden som 256 och 375.
Chr blev inte glad då... ;-)
Bytte till ChrW(), då jä..vv..lar gick det bättre. :-)
//håkanSv: Lägga till CHR(0) i en sträng
Man lär sig,hjälper inte att man tycker att man kan allt ;-)
Tycker Ni om och botanisera i EnKrypt/Dekrypt kan Ni väl kolla mitt gamla uppskick
http://www.pellesoft.se/communicate/userprogram/program.aspx?tid=699
Skulle vara kul om Ni vill betygsätta.Sv:Lägga till CHR(0) i en sträng
EDIT: Typiskt.. precis när jag postat detta så fungerade det.
//HåkanSv:Lägga till CHR(0) i en sträng
Programmet helt OK.
Verkar fungera utan buggar.
Det enda som jag tänkte på är messageboxarna som poppar upp hela tiden,
för attt hålla ordning på användaren.
Kan bli lite jobbigt i längden.
Kanske ska man kunna stänga av/på "lösenordspåminnaren" om man tycker den blir jobbig.
Kanske ska programmet förutsätta att det som står i textboxen ska krypteras/dekrypteras.
Då slipper programmet att skicka upp messageboxen om "markera text".
Petitesser ur en användarsynvinkel.
Programmet gör jobbet.
//HåkanSv: Lägga till CHR(0) i en sträng
för attt hålla ordning på användaren.
Kan bli lite jobbigt i längden. >
Nix kommer jag aldrig att ändra på !
Har varit militär i hela mitt yrkesliv.
Vet att "beväringar" inte kommer ihåg dag för dag vad som gäller ;-)Sv:Lägga till CHR(0) i en sträng
Snubblade på det här i hjälpen:
Robust Programming
Null characters (equivalent to Chr(0)) in the string will lead to unexpected results when using the string.
The null character will be included with the string,
but characters following the null character will not be displayed in some situations. </b>
Intressant... förutom att jag har nämnt det två gånger tidigare i tråden... Jag kan inte förstå att folk inte läser igenom trådarna innan de svarar...Sv:Lägga till CHR(0) i en sträng
Håller med att användarna måste styras upp ibland.
Men man kan också göra så att användaren kan bestämma själv hur han/hon vill ha det.
Då kan de som vet att de har ordning på sig, på egen "risk" kan stänga av det.
Vet också att det folk irriterar/stör sig på, slutar de att använda efter ett tag.
Hursomhelst detta påverkar inte programmets grundfunktionalitet.
Detta faller under kategorin "smaksak".
//HåkanSv: Lägga till CHR(0) i en sträng
<b>Intressant... förutom att jag har nämnt det två gånger tidigare i tråden... Jag kan inte förstå att folk inte läser igenom trådarna innan de svarar...</b>
Visst hade jag (i alla fall) läst det.
Tyckte att det kunde vara intressant att posta (bara för din skull ;-) ),
då diskussionen hade cirkulerat runt ämnet.
Personligen tror jag inte att det är problemet.
Detta då jag inte har några problem med att köra koden, med önskat resultat.
Då skulle det inte uppstå bara ibland, eller hur?
Såvida jag inte missat något, det har hänt förr.
//HåkanSv:Lägga till CHR(0) i en sträng
Vi är överens om att Null är en "terminater" strängen är slut här. BASTA !
Men det går att beskriva Null i tex. String, Label eller/och TextBox.
det blir för mig ett svart streck.Sv: Lägga till CHR(0) i en sträng
Skulle var kul om detta går att lösa.
Lð+?/èäê•lƒ*hùŒD à|ª;>“½h2‡¬jpT|8ÍOÉ*V#Ìó1à/1†´·å´ÊW{
Lösenord: SvenPon
http://www.pellesoft.se/communicate/userprogram/program.aspx?tid=699Sv:Lägga till CHR(0) i en sträng
Fann detta angående ChrW(). Intressant!
<b>Use the wide AscW and ChrW$
PA VB works in Unicode internally. Every string is in Unicode, which it takes 2 bytes per character.
You don't have to be writing international applications to take advantage of a couple of Unicode tricks.
Consider the following functions: Asc(), Chr$(). What's wrong with them? They are the slower versions.
If you're concerned about speed, use the wide versions instead: AscW(), ChrW$().
AscW() is not the same as Asc(). They return different values. ChrW$() is different from Chr$() because they take different parameter values. However, AscW() equals Asc() and ChrW$() equals Chr$() when working with characters from ASCII/Ansi 0 to 127. </b>
Detta var vad du hade krypterat:
<b>Från SvenPon
Tycker detta är en kanonSite
Ha det bra Gott Folk</b>
//HåkanSv: Lägga till CHR(0) i en sträng
Kryptot i sig kommer att kosta alla "besserwissers" oändlig tid att lösa om
bara du och mottagaren känner till lösenordet.
Tack för din respons.Sv:Lägga till CHR(0) i en sträng
Sven och Niklas, här kommer mer info för er vetgiriga.
Angående Null Chr(0) och VB strängar.
<b>As you may know, in VB 6, strings were implemented as a data type known as the BSTR.
A BSTR is a pointer to a character array that is preceded by a 4-byte Long specifying the length of the array.</b>
Från Visual C++.NET har jag tagit följande beskrivning av BSTR:
<b>The BSTR variable is apointer to a zero-terminated character array with a character count in front.
A BSTR variable can therefore contain binary characters, including zeros.</b>
Blanda inte ihop zero ovan med null.
//HåkanSv: Lägga till CHR(0) i en sträng
Sv:Lägga till CHR(0) i en sträng
<b>Från SvenPon
Tycker detta är en kanonSite
Ha det bra Gott Fo@kg</b>
Konstigt är det men meddelandet är solklart ;-)Sv: Lägga till CHR(0) i en sträng
Får samma fel, ju mer jag försöker desto värre blir det.
?????
//HåkanSv:Lägga till CHR(0) i en sträng
I VB 6.0 så kan man hantera CHR(0) i strängvariabler, i VS 2003 så fungerar inte detta längre.