Toon posts:

[VB6] Long data type gebruiken in een String *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Ik wil in Visual Basic een string van het type Long plaken aan een Sting.
Maar wel zo dat het 4 Bytes blijven. als het in de sting zit

als je Cstr() doet op de long dan maakt hij er net zo veel bytes van als hij nodig heeft om het in cijfers neer te zetten. terwijl het voor mijn doel wel 4 Bytes groot moet blijven.

Iemand enig idee hoe je dit zou moeten aanpakken

Verwijderd

geen idee wat je eigenlijk wilt :?
Een Long met een waarde van 12345678 neemt 4 Bytes, als je het omzet naar een String neemt het per definitie 8 bytes, omdat het nou eenmaal 8 characters zijn. Dat is toch gewoon hoe het werkt?

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Hij wil gewoon de bytes opnemen zoals ze zijn. Dat kan op zich wel, denk ik. Misschien moet je de long eerst omzetten naar een byte array en dan aan de string toevoegen?

Wat je niet moet vergeten is dat Strings eigenlijk niet bedoeld zijn om byte data te bevatten, dus dat kan onverwachtse problemen opleveren.

[ Voor 30% gewijzigd door bigbeng op 24-06-2004 11:58 ]


Verwijderd

Topicstarter
bigbeng

Ik zou het graag willen omzetten in een Byte array maar ook dat zou ik niet weten hoe ik dat moet doen.

ook zeg je dat een string hier niet voor bedoelt is om binary data vast te houden Welk datatype is hier wel geschikt voor ??

waar ik het voor nodig heb is het volgende
ik moet een string maken waar de eerste 4 bytes aangeven welk gedeelte de data te behoort en de rest van de string is dan de data
je snapt als ik de waarde in een long (Bijvoorbeeld 12345678) omzet naar een string dat er dan 8 Bytes uit komen namelijk voor elk getal 1 Byte en daar kan ik weer net niks mee

Mischien is me verhaal zo iets duidelijker

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Verwijderd schreef op 24 juni 2004 @ 12:08:
...
Mischien is me verhaal zo iets duidelijker
Niet echt, maar we proberen er toch iets van te maken ;)

Het datatype dat wel geschikt is voor dit soort data is een byte array. Die kunt je als volgt maken:

code:
1
Dim btArray As Byte(4)


Ik heb even geen tijd om een codevoorbeeld in te typen om een Long om te zetten naar byte array, maar volgens mij zijn er wel tweakers die dit snel kunnen.

Verwijderd

Topicstarter
Nou als een ander tweaker dat zou kunnen posten zou dat wel handig zijn

Het Byte array maken daar was ik al achter deed het zelf wel iets ander maar goed
het plaatsen van een long in dat array is mij een raatsel

Zo maak ik altijd een byte array
code:
1
Dim arrByte() as Byte

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Wat dacht je van een User Defined Type?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Type MyData
  myLong as long
  myString as String
End Type

...
...
Dim bla as myData

bla.myLong = 12345678
bla.myString = "Dit is je string"

...
...

MsgBox "De long is: " & bla.myLong & ", en de string is: " & bla.myString

Dan heb je het TOCH bij elkaar in 1 variabele. Je zou ook een class kunnen aanmaken, maar is misschien een beetje over-done voor dit probleem.

Verder heb ik het idee dat je niet echt weet waar je mee bezig bent. Volg eens een tutorial, of een les VB? (NOFI)

In een string is ieder karakter 1 byte, of 2 bytes bij unicode strings. Zou je er een long in willen stoppen, dan ben je dus sowieso al 2 of 4 chars(=bytes) kwijt van je string. Je kunt een long dus no-way in 1 char stoppen. En dan nog: Het zou "onleesbare zut" opleveren in je string. Dan krijg je dus bijvoorbeeld "blablabla".

Je kunt 't er wel weer uit peuteren enzo, maar ik zie geen goede reden waarom je die string zou moeten beginnen met een long erin... 't Klinkt me dan ook als een erg ranzige oplossing in de oren, OF je hebt de opdracht niet begrepen.

[ Voor 50% gewijzigd door RobIII op 24-06-2004 13:16 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
zou ook kunnen in HEX maar dat betekend dat een Long 8 Bytes in neem in Hex in plaats van 4 en ik wil het zo klein mogelijk houden dus 4 Bytes

Verwijderd

Topicstarter
Hier een voorbeeld van wat ik ongeveer wil alleen dit werkt natuurlijk niet dus dit moet je zien als pseudo code

code:
1
2
3
4
5
6
7
8
9
10
11
'Dit gebeurt op PC die het verstuurt
Dim lngMyPointer AS Long
Dim strMyData AS String
Dim strMyDataToBeSend as String

lngMyPointer = 65537
strMyData = "Eeen hele hoop BinaryData"

strMyDataToBeSend = lngMyPointer & strMyData

SendData(strMyDataToBeSend)


code:
1
2
3
4
5
6
7
8
9
'Data word verzonden over internet en komt aan op andere PC
Dim strDataFromInternet AS String
Dim lngMyPointer AS Long
Dim strMyData AS String

strDataFromInternet = GetData

lngMyPointer = Left(strDataFromInternet, 4)
strData = Mid(strDataFromInternet, 4)


Mischien is het zo duidelijk wat ik wil

de Functie SendData en GetData zijn niet van mij en kan ik ook niks aan aanpassen en accepteren alleen Sting's als input

iemand hier een oplossing voor

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Laat me raden: Je werkt met Winsock?
Dan moet je sowieso byte arrays gaan gebruiken. En dan kun je beter een "protocol" uitdenken. Waarbij je bijv. zegt: 1e vier bytes zijn altijd "blabla" (de long) en daarna volgt een null-terminated string of whatever.

Maar nogmaals, ik denk dat je nog op het verkeerde spoor zit te denken. Je kunt een long NIET zomaar in een string duwen zonder gekke tekens te krijgen enzo. Je kunt wel de string en de long samen in een byte-array duwen. En je kan natuurlijk ook eerst senddata aanroepen met de long, en meteen daarna met de string. Je krijgt het dan (volgens mij) toch als 1 string binnen, want de MsWinsock OCX wacht tot z'n buffer vol is en stuurt dan de data pas (ik kan me hierin vergissen, maar dat staat vast in MSDN).

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
dat klopt deels en ja ik ben met winsock bezig

als je een DoEvent doet dan zend hij het meteen
en nee hij zal het ombouwen tot een sting en is het meer dan 4Bytes die hij zal versturen

over die rare tekens kan ik simpel zijn dat ziet er alleen raar uit als je het op het scherm laat zetten en dat ben ik niet vanplan gaat om file data

en SendData van Winsock kan niet overweg met ByteArray's (niet helemaal waar want een sting is stiekem ook een byte array op Asm nivo)

maar goed dan word de vraag dus hoe bou ik een Long Valua om naar een Byte Array met 4 elementen.

En dit is een onderdeel van een protocal wat ik heb verzonnen maar geen idee hoe ik VB zo ver kan krijgen dat hij niet zo inteligent gaat zitten doen.

maar goed als iemand mij een voorbeeld kan geven hoe ik een long in een byte array kan plaatsen van 4 elementen dan ben ik ook al blij (Heb ik namelijk stiekem toch wat ik wil)

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Als ik mij niet vergis is de AND operator een bitsgewijze operator. Er van uitgaande dat je dus de meest significante groep van 8 bits wilt hebben moet je dus een and doen met 11111111 00000000 00000000 00000000.
Het resultaat kun je delen door 2^24 en dan staat het meest linker deel van het getal in je variabele.
Deze kun je met ChrB omzetten naar een byte.

Ik geef je alleen maar een hint, ten eerste omdat ik vind dat je het zelf verder mag uitzoeken en ten tweede omdat ik te lui ben ;)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op 24 juni 2004 @ 14:39:
dat klopt deels en ja ik ben met winsock bezig

als je een DoEvent doet dan zend hij het meteen
en nee hij zal het ombouwen tot een sting en is het meer dan 4Bytes die hij zal versturen

over die rare tekens kan ik simpel zijn dat ziet er alleen raar uit als je het op het scherm laat zetten en dat ben ik niet vanplan gaat om file data

en SendData van Winsock kan niet overweg met ByteArray's (niet helemaal waar want een sting is stiekem ook een byte array op Asm nivo)

maar goed dan word de vraag dus hoe bou ik een Long Valua om naar een Byte Array met 4 elementen.

En dit is een onderdeel van een protocal wat ik heb verzonnen maar geen idee hoe ik VB zo ver kan krijgen dat hij niet zo inteligent gaat zitten doen.

maar goed als iemand mij een voorbeeld kan geven hoe ik een long in een byte array kan plaatsen van 4 elementen dan ben ik ook al blij (Heb ik namelijk stiekem toch wat ik wil)
Je hoeft mij niks uit te leggen hoor ;)

Je kunt met copymemory makkelijk een long in een byte array kopieeren.
code:
1
2
3
4
5
6
7
8
9
10
11
12
    Dim arrData(0 to 3) As Byte
    Dim myData As Long
    
    myData = 1234
    
    'Long to byte array
    CopyMemory arrData(0), myData, 4
    
    'Byte array to long
    CopyMemory myData, arrData(0), 4
    
    Debug.Print myData


Je moet dan wel effe een API declare in je source gooien:
code:
1
2
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (pDest As Any, pSource As Any, ByVal nLen As Long)


En nu jij weer :Y)

[ Voor 6% gewijzigd door RobIII op 24-06-2004 15:15 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
RobIII schreef op 24 juni 2004 @ 15:14:
[...]

Je hoeft mij niks uit te leggen hoor ;)

Je kunt met copymemory makkelijk een long in een byte array kopieeren.
code:
1
2
3
4
...
    'Long to byte array
    CopyMemory arrData(0), myData, 4
...


Je moet dan wel effe een API declare in je source gooien:
code:
1
2
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (pDest As Any, pSource As Any, ByVal nLen As Long)
En zo leer je nog eens wat... (copy-paste to personal library :) )

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Verwijderd schreef op 24 juni 2004 @ 14:39:
als je een DoEvent doet dan zend hij het meteen
Daar zou ik geen vergif op innemen eigenlijk. Het rottige van die winsock control, en ook de onderliggende winsock lib is dat je daar nou net niet echt veel controle over hebt. ( Afhankeljk van je definitie van 'meteen' natuurlijk )

[ Voor 9% gewijzigd door farlane op 24-06-2004 15:21 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
En als je dan toch bezig bent, kom ik weer terug op mijn UDT suggestie:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (pDest As Any, pSource As Any, ByVal nLen As Long)

Private Type myData
    myLong As Long
    myString As String * 100
End Type

Private Sub DoeIets()
    Dim arrData() As Byte
    Dim bla As myData
    Dim jaja As myData
    
    bla.myLong = 1234
    bla.myString = "Dit is een test"
    
    'Kopieer UDT naar byte array
    ReDim arrData(0 To LenB(bla) - 1)
    CopyMemory arrData(0), bla, LenB(bla)

    'Kopieer byte array naar UDT
    CopyMemory jaja, arrData(0), LenB(jaja)
    
    Debug.Print "Long:" & jaja.myLong
    Debug.Print "String:" & jaja.myString
End Sub

Sim-pel :Y)

[ Voor 23% gewijzigd door RobIII op 24-06-2004 15:28 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
Dank u meneer RobIII duurde ff voor ik begrepen werkt maar dan toch z'n mooi antwoord. en ik kan er nog wat mee ook wat wil een mens nog meer

})

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Zou dit niet een manier zijn om je probleem op te lossen zoals je origineel had bedacht?

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Function LongToByteArray(ByVal LongValue As Long) As Byte()
  Dim Result(3) as Byte
  Dim bytLoop   as Byte

  'Doe de stappen voor iedere byte van de long.
  For bytLoop = 0 To 3
    'Haal steeds de LSB uit de long dmv van een bitwise AND
    Result(bytLoop) = LongValue And 255
    'Door een rightshift van 8 gooi je de 8 bits eruit die je net hebt bewaard    
    LongValue = RightShift(LongValue, 8)
  Next
  LongToByteArray = Result
End Function  


Heb de code niet getest, alleen ff zo uitgedacht. Ook de functie RightShift heb ik nog niet uitgedacht :)

[ Voor 4% gewijzigd door Lorn op 24-06-2004 16:19 ]


Verwijderd

Topicstarter
Lorn
Das mischien ook een idee
maar wat is sneller denk je zoals jij het voorsteld of zoals eerder is voorgesteld via een API Call ??

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

API Call zonder twijfel. Ik wil ook absoluut niet voorstellen dat je mijn oplossing overneemt. Maar ik was aan het denken gezet hoe je de long in een bytearray zou kunnen krijgen en hoe je de afzonderlijke bytes eruit zou kunnen halen. Was dus meer pure interesse dan praktische toepasbaarheid wat me heeft geinspireerd tot die oplossing.

[ Voor 11% gewijzigd door Lorn op 24-06-2004 16:37 ]


Verwijderd

Topicstarter
Das altijd leuk om te weten nog meer mogelijk heden om iets te doen
en vooral leuk als het binnen VB zelf kan en je niet meteen API's hoeft aan te roepen om zoiets relatief simpels te kunnen

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Lorn schreef op 24 juni 2004 @ 16:12:
Zou dit niet een manier zijn om je probleem op te lossen zoals je origineel had bedacht?
Je moet bij VB erg goed oppassen dat dit soort dingen geen runtime errors gooien ( overflow enzo )
Bovendien is een API call wat sneller denk ik, scheelt weer wat berekeningen. ( schuiven kun je overigens doen door te vermenigvuldigen/delen door twee )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

farlane schreef op 24 juni 2004 @ 16:40:
[...]


Je moet bij VB erg goed oppassen dat dit soort dingen geen runtime errors gooien ( overflow enzo )
Bovendien is een API call wat sneller denk ik, scheelt weer wat berekeningen. ( schuiven kun je overigens doen door te vermenigvuldigen/delen door twee )
Volgens mij kan de routine ook niet omgaan met negatieve getallen... Maar zoals ik al zei het was niet bedoelt als een serieus alternatief.

Mijn RightShift functie zou je dus moeten kunnen vervangen door:
Visual Basic:
1
LongValue = LongValue \ 256

Toch?

Net even m'n routine uitgeprobeerd... positieve getallen gaan goed. Zat allleen een klein foutje in had eerst "LongValue / 256" ipv "LongValue \ 256". Blijkbaar is het zo dat 255 / 256 = 1 en 255 \ 256 = 0. Als je een negatief getal opgeeft dan gaat het inderdaad fout. De invoer -10 geeft als uitvoer (0, 0, 0, 246).

[ Voor 22% gewijzigd door Lorn op 24-06-2004 17:02 . Reden: Resultaat van test toegevoegd ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Lorn schreef op 24 juni 2004 @ 16:54:
[...]


Volgens mij kan de routine ook niet omgaan met negatieve getallen... Maar zoals ik al zei het was niet bedoelt als een serieus alternatief.

Mijn RightShift functie zou je dus moeten kunnen vervangen door:
Visual Basic:
1
LongValue = LongValue \ 256

Toch?

Net even m'n routine uitgeprobeerd... positieve getallen gaan goed. Zat allleen een klein foutje in had eerst "LongValue / 256" ipv "LongValue \ 256". Blijkbaar is het zo dat 255 / 256 = 1 en 255 \ 256 = 0. Als je een negatief getal opgeeft dan gaat het inderdaad fout. De invoer -10 geeft als uitvoer (0, 0, 0, 246).
Mijn routine kan overweg met negatieve getallen hoor :?
En ik weet 99.9999% zeker dat 1 API call naar CopyMemory sneller is dan zelf in een for-lus gaan liggen shiften of delen door 256 en vervolgens AND-en met bla en bla bla


ah, jullie hebben het zelf ook al ontdekt :Y)

Wat is het probleem met zo'n simpele API call?

[ Voor 5% gewijzigd door RobIII op 24-06-2004 17:46 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

RobIII schreef op 24 juni 2004 @ 17:45:
[...]

Wat is het probleem met zo'n simpele API call?
Daar is ook geen probleem mee. Eigenlijk is heel mijn routine offtopic geblaat, de TS had immers al een perfecte oplossing. Zoals ik al schreef ik wou ff voor mezelf uitzoeken hoe je de individuele bytes uit een long zou moeten halen. Omdat ik dacht dat misschien iemand anders hier het ook wel leuk zou vinden heb ik de routine gepost. Ook ik ben er van overtuigd dat de API-call beter en sneller is dan mijn routine.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Yup
Net even m'n routine uitgeprobeerd... positieve getallen gaan goed. Zat allleen een klein foutje in had eerst "LongValue / 256" ipv "LongValue \ 256".
De ene is een floating point deling , de ander een integer deling.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1