/ Forside / Teknologi / Udvikling / VB/Basic / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
VB/Basic
#NavnPoint
berpox 2425
pete 1435
CADmageren 1251
gibson 1230
Phylock 887
gandalf 836
AntonV 790
strarup 750
Benjamin... 700
10  tom.kise 610
Hente HEX/binær data fra fil?
Fra : Jens Rex Bræmhøj


Dato : 16-02-02 01:00

Jeg har en fil som jeg gerne vil læse de 4 første bytes fra. Kan se med
UltraEdit at disse bytes er "FF FB 90 4C". Hvordan kan jeg læse en fil i VB
så jeg får dette output? Lige nu siger den bare "ÿûL". Og hvad med binært?
(11111111111110111001000001001100).

Altså, det er ikke så meget det at læse selve filen, det har jeg efterhånden
fundet ud af... det er mere formatet af outputtet jeg gerne vil ændre.

Har rodet rundt på MSDN, men jeg kunne ikke finde noget klart og tydeligt om
det. Er ikke super stærk i det her.

--
-jrb



 
 
Jens Rex Bræmhøj (16-02-2002)
Kommentar
Fra : Jens Rex Bræmhøj


Dato : 16-02-02 17:25

> Altså, det er ikke så meget det at læse selve filen, det har jeg
efterhånden
> fundet ud af... det er mere formatet af outputtet jeg gerne vil ændre.

Har løst problemet. Ved ikke om det er på den bedste måde, men here goes:

Jeg lavede en decimal til binær konverterings funktion:
----------------
Public Function dec2bin(mynum As Variant) As String

If mynum >= 2 ^ 8 Then
dec2bin = "Number too big"
Exit Function
End If

Dim j As Integer
j = 7

For j = 7 To 0 Step -1
If mynum >= 2 ^ j Then
dec2bin = dec2bin & 1
mynum = mynum - 2 ^ j
Else
dec2bin = dec2bin & 0
End If
Next

End Function
----------------


Så henter jeg en byte ad gangen, og konverterer den til decimal og smider
den ind i min dec2bin() funktion.
----------------
Private Sub Command2_Click()
Open CommonDialog1.FileName For Binary Access Read As #1

Dim i As Integer
i = 1

For i = 1 To 4
Seek #1, i
mp3temp = mp3temp & ";" & dec2bin(Asc(Input(i, #1)))
Next

Close #1

MsgBox (mp3temp)

End Sub
----------------

Nogen der har nogen kommentarer til min løsning? Kunne det have været gjort
bedre?

--
Jens



Helge Bjørkhaug (16-02-2002)
Kommentar
Fra : Helge Bjørkhaug


Dato : 16-02-02 17:56

On Sat, 16 Feb 2002 01:00:25 +0100, "Jens Rex Bræmhøj" <nospam@fuckup.dk>
wrote:

>Jeg har en fil som jeg gerne vil læse de 4 første bytes fra. Kan se med
>UltraEdit at disse bytes er "FF FB 90 4C". Hvordan kan jeg læse en fil i VB
>så jeg får dette output? Lige nu siger den bare "ÿû?L". Og hvad med binært?
>(11111111111110111001000001001100).
>
>Altså, det er ikke så meget det at læse selve filen, det har jeg efterhånden
>fundet ud af... det er mere formatet af outputtet jeg gerne vil ændre.
>
>Har rodet rundt på MSDN, men jeg kunne ikke finde noget klart og tydeligt om
>det. Er ikke super stærk i det her.

Ingen elegant løsning, men....

Private byte1 As Byte
Private byte2 As Byte
Private byte3 As Byte
Private byte4 As Byte
Private header As String
Private 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
Private Sub Form_Load()
Dim myfile
myfile = FreeFile
Open "d:\clock.exe" For Binary Access Read As #myfile
Get #myfile, , byte1
Get #myfile, , byte2
Get #myfile, , byte3
Get #myfile, , byte4
header = Hex$(byte1) & Hex$(byte2) & Hex$(byte3) & Hex$(byte4)
MsgBox header
MsgBox Hex2Bin(header)
Close #myfile
End Sub

--
Snutten
Fjern helge og .invalid fra mailadressen før du svarer via mail.

Rayman (17-02-2002)
Kommentar
Fra : Rayman


Dato : 17-02-02 16:53

Hvis du læser i binær mode, så kan du bruge
Dim lMyLong as long
Get lFileHandle,lFilePos,lmyLong
Så konverterer den selv little endian, og det hele

Elers må beregningen jo være byte4 + byte3 * 2 ^ 8 + byte2 * 2 ^16 + byte1 *
2 ^ 24

Og der skal du huske at bruge longs, da den ellers giver overflow.

Husk også at du i VB ikke kan indlæse en "unsigned long" dvs. hvor den føste
bit ikke bruges til at angive negative tal.

Mvh. Rayman

"Helge Bjørkhaug" <helgesnutten@techie.online.no.invalid> wrote in message
news:4n3t6uoa9ff8u63eo9vpgq84utqk3v8bkk@4ax.com...
> On Sat, 16 Feb 2002 01:00:25 +0100, "Jens Rex Bræmhøj" <nospam@fuckup.dk>
> wrote:
>
> >Jeg har en fil som jeg gerne vil læse de 4 første bytes fra. Kan se med
> >UltraEdit at disse bytes er "FF FB 90 4C". Hvordan kan jeg læse en fil i
VB
> >så jeg får dette output? Lige nu siger den bare "ÿû?L". Og hvad med
binært?
> >(11111111111110111001000001001100).
> >
> >Altså, det er ikke så meget det at læse selve filen, det har jeg
efterhånden
> >fundet ud af... det er mere formatet af outputtet jeg gerne vil ændre.
> >
> >Har rodet rundt på MSDN, men jeg kunne ikke finde noget klart og tydeligt
om
> >det. Er ikke super stærk i det her.
>
> Ingen elegant løsning, men....
>
> Private byte1 As Byte
> Private byte2 As Byte
> Private byte3 As Byte
> Private byte4 As Byte
> Private header As String
> Private 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
> Private Sub Form_Load()
> Dim myfile
> myfile = FreeFile
> Open "d:\clock.exe" For Binary Access Read As #myfile
> Get #myfile, , byte1
> Get #myfile, , byte2
> Get #myfile, , byte3
> Get #myfile, , byte4
> header = Hex$(byte1) & Hex$(byte2) & Hex$(byte3) & Hex$(byte4)
> MsgBox header
> MsgBox Hex2Bin(header)
> Close #myfile
> End Sub
>
> --
> Snutten
> Fjern helge og .invalid fra mailadressen før du svarer via mail.



Tomas Christiansen (17-02-2002)
Kommentar
Fra : Tomas Christiansen


Dato : 17-02-02 21:51

Rayman skrev:
> Elers må beregningen jo være byte4 + byte3 * 2 ^ 8 + byte2 * 2 ^16 +
byte1 *
> 2 ^ 24
>
> Og der skal du huske at bruge longs, da den ellers giver overflow.
>
> Husk også at du i VB ikke kan indlæse en "unsigned long" dvs. hvor
den føste
> bit ikke bruges til at angive negative tal.

Hvorfor den metode, som du her angiver med "byte4 + ... byte1 * 2^24",
i denne sammenhæng IKKE er anvendelig.
(Med mindre, naturligvis, at man positivt VED at de 4 bytes, som læses
fra filen, netop ER en "signed long", men de fremgår ikke af
indlæggende, at det skulle være tilfældet.)

Ikke sandt?

-------
Tomas


Rayman (18-02-2002)
Kommentar
Fra : Rayman


Dato : 18-02-02 17:01

Helt rigtigt. Godt set :)
Man skal faktisk bruge Double's så vidt jeg kan se, da de er 8-byte
variabler, hvis man vil indlæse en unsigned long. Single's er kun 4 byte.

Jeg skrev beregningen, hvis det ikke er muligt at udføre et binært input.
Hvis man f.eks. parser en streng.

Mvh. Rayman.


"Tomas Christiansen" <toc@blikroer.removethis.dk> wrote in message
news:a4p54o$2q0$1@news.cybercity.dk...
> Rayman skrev:
> > Elers må beregningen jo være byte4 + byte3 * 2 ^ 8 + byte2 * 2 ^16 +
> byte1 *
> > 2 ^ 24
> >
> > Og der skal du huske at bruge longs, da den ellers giver overflow.
> >
> > Husk også at du i VB ikke kan indlæse en "unsigned long" dvs. hvor
> den føste
> > bit ikke bruges til at angive negative tal.
>
> Hvorfor den metode, som du her angiver med "byte4 + ... byte1 * 2^24",
> i denne sammenhæng IKKE er anvendelig.
> (Med mindre, naturligvis, at man positivt VED at de 4 bytes, som læses
> fra filen, netop ER en "signed long", men de fremgår ikke af
> indlæggende, at det skulle være tilfældet.)
>
> Ikke sandt?
>
> -------
> Tomas
>



Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste