|
| splitte long til bytes Fra : Troels Thomsen |
Dato : 09-05-03 11:08 |
|
Hej
Hvis value er &hAABBCCDD, hvordan får jeg så nemmest pillet de 4 bytes ud ?
(Jeg dividerer fordi jeg ikke kan finde en shift operator i vb. Kan det
virkeligt passe ?)
mit første forsøg var:
val = &HAABBCCDD
val = val \ 2 ^ 24 ' b is aa
b = val ' overflow fordi val er -86,
t.data = Chr(b) ' add to string
val = val - (b * s ^ 24) ' val is now bbccdd
b = val \ 2 ^ 16 ' b is bb
t.data = t.data & Chr(b) ' add to string
val = val - (b * s ^ 16) ' val is now ccdd
etc
mvh Troels
| |
Helge Bjørkhaug (09-05-2003)
| Kommentar Fra : Helge Bjørkhaug |
Dato : 09-05-03 19:48 |
|
On Fri, 9 May 2003 12:07:44 +0200, "Troels Thomsen"
<troels.thomsen@mailteledk> wrote:
>
>Hej
>
>Hvis value er &hAABBCCDD, hvordan får jeg så nemmest pillet de 4 bytes ud ?
>(Jeg dividerer fordi jeg ikke kan finde en shift operator i vb. Kan det
>virkeligt passe ?)
>
>mit første forsøg var:
>
> val = &HAABBCCDD
> val = val \ 2 ^ 24 ' b is aa
> b = val ' overflow fordi val er -86,
> t.data = Chr(b) ' add to string
> val = val - (b * s ^ 24) ' val is now bbccdd
>
> b = val \ 2 ^ 16 ' b is bb
> t.data = t.data & Chr(b) ' add to string
> val = val - (b * s ^ 16) ' val is now ccdd
Public Function Hex2Bin(ByVal sHex As String) As String
Dim i As Integer
Dim j As Integer
Dim nDec As Double
Const HexChar As String = "0123456789ABCDEF"
For i = 1 To Len(sHex)
nDec = InStr(1, HexChar, Mid(sHex, i, 1)) - 1
For j = 3 To 0 Step -1
Hex2Bin = Hex2Bin & nDec \ 2 ^ j
nDec = nDec Mod 2 ^ j
Next j
Next i
i = InStr(1, Hex2Bin, "1")
If i <> 0 Then Hex2Bin = Mid(Hex2Bin, i)
End Function
--
Snutten
Reply-to adressen er gyldig inntil spam er mottatt
| |
Tomas Christiansen (09-05-2003)
| Kommentar Fra : Tomas Christiansen |
Dato : 09-05-03 22:09 |
|
Helge Bjørkhaug skrev:
> Public Function Hex2Bin(ByVal sHex As String) As String
>
> Dim i As Integer
> Dim j As Integer
> Dim nDec As Double
> Const HexChar As String = "0123456789ABCDEF"
>
> For i = 1 To Len(sHex)
> nDec = InStr(1, HexChar, Mid(sHex, i, 1)) - 1
>
> For j = 3 To 0 Step -1
> Hex2Bin = Hex2Bin & nDec \ 2 ^ j
> nDec = nDec Mod 2 ^ j
> Next j
>
> Next i
>
> i = InStr(1, Hex2Bin, "1")
> If i <> 0 Then Hex2Bin = Mid(Hex2Bin, i)
> End Function
Inspireret af dit forslag, Helge, er her et andet forslag, som er lidt
kortere og kører lidt hurtigere:
Function Hex2Bin(ByVal sHex As String) As String
Const sHexBin As String = "0000 0001 0010 0011 0100 0101 0110 0111 1000
1001 1010 1011 1100 1101 1110 1111"
Dim lDigitNo As Long
For lDigitNo = 1 To Len(sHex)
Hex2Bin = Hex2Bin & Mid(sHexBin, 5 * Val("&h" & Mid(sHex, lDigitNo, 1))
+ 1, 4)
Next
End Function
-------
Tomas
| |
Helge Bjørkhaug (10-05-2003)
| Kommentar Fra : Helge Bjørkhaug |
Dato : 10-05-03 11:34 |
|
On Fri, 9 May 2003 23:09:06 +0200, "Tomas Christiansen"
<toc-01-nospam@blikroer.dk> wrote:
>Inspireret af dit forslag, Helge, er her et andet forslag, som er lidt
>kortere og kører lidt hurtigere:
>
>Function Hex2Bin(ByVal sHex As String) As String
> Const sHexBin As String = "0000 0001 0010 0011 0100 0101 0110 0111 1000
>1001 1010 1011 1100 1101 1110 1111"
> Dim lDigitNo As Long
>
> For lDigitNo = 1 To Len(sHex)
> Hex2Bin = Hex2Bin & Mid(sHexBin, 5 * Val("&h" & Mid(sHex, lDigitNo, 1))
>+ 1, 4)
> Next
>End Function
Ja, den var "neat".
Kan dog ikke brukes på BLOB.
Men de som jobber med så mange bit, kjenner vel også til begrensningene
--
Snutten
Reply-to adressen er gyldig inntil spam er mottatt
| |
Tomas Christiansen (10-05-2003)
| Kommentar Fra : Tomas Christiansen |
Dato : 10-05-03 23:05 |
|
Helge Bjørkhaug skrev:
> Kan dog ikke brukes på BLOB.
> Men de som jobber med så mange bit, kjenner vel også til begrensningene
Hvori består problemet?
Funktionen kan i øvrigt performance-tunes lidt ved begynde med at tildele
Hex2Bin så mange spaces, som der vil være bit i resultatet, og derefter i
løkken ved brug af Mid(Hex2Bin, 4 * lDigitNo - 3, 4) tildele 4 bit værdier
til 4 spaces, i stedet for at tilføje til slutningen af Hex2Bin for hver
gennemløb.
-------
Tomas
| |
|
|