Avatar billede sjh Nybegynder
05. september 2003 - 18:16 Der er 13 kommentarer og
1 løsning

C function til VB Function

Er der en som kan hjælpe mig med at lave denne function om til Visual Basic?

hvad gør: readc(f)
hvad er: 0x7f og 0x80 (value)

http://www.wapalize.co.uk/wbmp.htm

int readint(FILE *f) {
  int c=0, pos=0, sum=0;
  do {
    c = readc(f);
    sum = (sum << 7*pos++) | (c & 0x7f);
  } while(c & 0x80);
  return sum;
}
Avatar billede arne_v Ekspert
05. september 2003 - 19:25 #1
readc er ikke en standard c funktion men jeg er helt overbevist om
at den læser 1 byte fra filen.

0x7f og 0x80 er hexadecimale konstanter. Henholdsvis alle bit undtagen
højeste sat og kun højeste bit sat. Binært 01111111 og 10000000.

Jeg kan ikke gennemskue algoritmenten.
Avatar billede sjh Nybegynder
05. september 2003 - 20:03 #2
ok.. hvordan funker denne her så

hvad gør den: | er det ( <> støre eller mindre)
den her: pos++ må så være pos = pos + 1

sum = (sum << 7*pos++) | (c & 0x7f);
Avatar billede bertelbrander Novice
05. september 2003 - 20:40 #3
| betyder bitvist or (eller)

"sum = (sum << 7*pos++) | (c & 0x7f); " betyder; tag sum og skift den 7 pladser op for hver runde, og fyld de nederste 7 bit af c på i bunden af sum.

Man kunne forestille sig at man modtog en række bytes hvor MSB (højeste bit) er sat for den sidste byte og ikke sat for de første. For hver byte der modtages puttes de nederste 7 bit fra byten ind i et resultat.

Det passer rimeligt med det koden, bortset fra at det ikke rigtigt giver mening at skifte sum op med 7 gange positionen for hver runde (men kun 7 for alle runder).
Avatar billede bertelbrander Novice
05. september 2003 - 20:50 #4
Korrektion: MSB er sat i alle bytes undtagen den sidste.
Avatar billede arne_v Ekspert
05. september 2003 - 20:55 #5
Der kan ihvertfald ikke være mange gennemløb ellers vel <<7*pos
jo mist mening.
Avatar billede sjh Nybegynder
05. september 2003 - 21:01 #6
byteBuf er det data som er i wbmp-file i array form

--------------------
Header Type:
    byteBuf(0)
    byteBuf(1)

Width
    byteBuf(2)
    byteBuf(3)

Height
    byteBuf(4)
    byteBuf(5)
--------------------

Et wbmp-billede på 120x120

Width
    byteBuf(2) = 120
    byteBuf(3) = 255

Height
    byteBuf(4) = 120
    byteBuf(5) = 255
--------------------

det passer måske meget godt, men et wbmp-billede på 130x130

Width
    byteBuf(2) = 129
    byteBuf(3) = 2

Height
    byteBuf(4) = 129
    byteBuf(5) = 2
--------------------

og et wbmp-billede på 600x600

Width
    byteBuf(2) = 132
    byteBuf(3) = 88

Height
    byteBuf(4) = 132
    byteBuf(5) = 88
--------------------

Jeg kan sq ikke se hvordan den bliver regnet ud??
Avatar billede arne_v Ekspert
05. september 2003 - 21:26 #7
Jo.

129 & 0x7f er 1
1 << 7 + 2 er 130

132 & 0x7f er 4
4 << 7 + 88 er 600

!
Avatar billede arne_v Ekspert
05. september 2003 - 21:26 #8
Og 120 er 120.

(fordi high bit ikke er sat stopper løkken)
Avatar billede arne_v Ekspert
05. september 2003 - 21:28 #9
Og den programmør der har lavet den C kode skulle have et los i røven.
Avatar billede sjh Nybegynder
05. september 2003 - 21:30 #10
ja sikker... men hvordan for jeg så lavet koden om til visual basic?

hvordan for du: 129 & 0x7f = 1
og hvad er: <<

??
Avatar billede arne_v Ekspert
05. september 2003 - 21:31 #11
Her er VB kode:

Function size(b1 As Integer, b2 As Integer) As Integer
    If b1 < 128 Then
        size = b1
    Else
        size = (b1 Mod 128) * 128 + b2
    End If
End Function

Function testsize()
    MsgBox Str(size(129, 2))
    MsgBox Str(size(132, 88))
End Function
Avatar billede arne_v Ekspert
05. september 2003 - 21:31 #12
<< er bitvis shift til venstre.

<<1 er det samme som *2
<<2 er det samme som *4
<<3 er det samme som *8
etc.
Avatar billede arne_v Ekspert
05. september 2003 - 21:33 #13
VB koden er vist rimelig klar.
Avatar billede sjh Nybegynder
05. september 2003 - 21:34 #14
ja det virker fint 1000000000000000000000000000000000000 tak for hjælpen... fedt :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester