Avatar billede anderskj1 Nybegynder
29. maj 2003 - 23:13 Der er 15 kommentarer og
1 løsning

Spejlvending af byte i chararray

Jeg har et langt chararray som indeholder data bitvist. Har i et forslag til en effektiv måde at "spejlvende" hver byte i arrayt?

Det kræver hvis lige en lille illustration: hvert tal illustrere en bit. MSB først LSB til sidst.


8 7 6 5 4 3 2 1|8 7 6 5 4 3 2 1|osv.


Hver byte skal nu spejlvendes (lang forklaering, men for at gøre et format kompatibelt) så MSB og LSB bliver vendt.

altså:

1 2 3 4 5 6 7 8| 1 2 3 4 5 6 7 8| osv

Det er altså ikke arrayet der skal spejles men hver byte der i.

Håber nogen har et forlsag

Mvh
Anders
Avatar billede arne_v Ekspert
29. maj 2003 - 23:18 #1
Lave et:
  char convert[256];
med de rigtige værdier og:

for(i=0;i<len;i++) data[i]=convert[(unsigned char)data[i]];
Avatar billede arne_v Ekspert
29. maj 2003 - 23:18 #2
Jeg har muligvis endda arrayet liggende !
Avatar billede anderskj1 Nybegynder
29. maj 2003 - 23:20 #3
Hehe. Arne dig igen :)- Det er faktisk i forbindelse med den kode som du gav til at skrive bit vist. Den skriver bit i omvendt rækkefølge af hvad der er "normalt". Problemet er at filen skal være kompaibel som bitsene skal vende "rigitg". MEn jeg kunne ikke gennemskue Addbits og hvordan jeg ændrede sp den gjorde det rigtig. Så jeg beslutete at lave helle array og så vende det om til sidst.
Avatar billede anderskj1 Nybegynder
29. maj 2003 - 23:21 #4
det var sgu dårlig dansk.
Avatar billede anderskj1 Nybegynder
29. maj 2003 - 23:23 #5
Problemet er at jeg aldrig har arbejdet bitvist andet lidt ASM og havde svært ved 100% at gennemskue den BitString klasse som du gav. Den virker ellers perfekt til formålet. (pånær den lille ting der)
Avatar billede arne_v Ekspert
29. maj 2003 - 23:24 #6
Nå.

Det er også i det kode at arrayet allerede er !

Prøv og kald getStringRev i.s.f. getString når du henter data ud !!
Avatar billede anderskj1 Nybegynder
29. maj 2003 - 23:32 #7
Jesus. Havde slettet det fra klassen i starten. Der lover jo godt. Det giver ikke problemer når man henter det igen med getBits.? Nu ved jeg ikke om du selv har lavet Klassen, men kan du kort opsummere hvad der reverse array laver??
Avatar billede anderskj1 Nybegynder
29. maj 2003 - 23:39 #8
Har lige testet det. Bitsene bliver nu lagt (umiddelbart) rigtig ind. har lige studeret filen bitvist. Men når jeg henter det igen gå det helt galt. Der skulle ikke have været en setStringRev vel?
Avatar billede anderskj1 Nybegynder
29. maj 2003 - 23:50 #9
Ser det her åndsvagt ud? Inden jeg går vidre med ideen.

void BitString::SetStringRev(void *Buffer,int Size)
{
  //simpel kopiring
    delete Body;
    Len = Size;
    Body = new char[Len];
   
    for(int i=0;i<(Size);i++)
      ((char *)Buffer)[i] = bits_reverse[UCHAR(((char *)Buffer)[i])];
   
    memcpy(Body,Buffer,Size);
    CurrPos = 0;
    return;
}
Avatar billede arne_v Ekspert
30. maj 2003 - 00:13 #10
Looks OK to me.
Avatar billede anderskj1 Nybegynder
30. maj 2003 - 00:15 #11
Det ser også ud til at virke. 1000 tak for hjæplen igen. Du har været til uvurdelig hjælp med hele denne sag. Er det svært at forklarer det med bits_reverse arrayet? Ellers må jeg bare accepttere at det virker. (foi det gør det nu)
Avatar billede arne_v Ekspert
30. maj 2003 - 00:22 #12
Næh det er såmænd såre simpelt.

index 0 -> 0x00 => 0x00 -> 0x00 => 00000000 -> 00000000
index 1 -> 0x80 => 0x01 -> 0x80 => 00000001 -> 10000000
index 2 -> 0x40 => 0x02 -> 0x40 => 00000010 -> 01000000
index 3 -> 0xC0 => 0x03 -> 0xC0 => 00000011 -> 11000000
Avatar billede anderskj1 Nybegynder
30. maj 2003 - 00:33 #13
Ahh nu fatter jeg det. Der selvfølgelig et endelig antal kombinationer på 8 bits. Er det virkelig en smart måde? Kan man ikke rotere bitsene? Synes jeg fra ASM kan huske noget med at man kunne "rotateleft" så bitsene hoppede om på den anden side af byten, modsat >> og << som jo bare smider bitseene væk så og sige. Men det er måske mere effektiv med et array.
Avatar billede arne_v Ekspert
30. maj 2003 - 00:45 #14
Det er meget hurtigt at lave opslag i et array.

Og man kan ikke shifte/rotate.

00001011 -> 11010000 kan mig bekendt ikke laves med shift/rotate.
Avatar billede anderskj1 Nybegynder
30. maj 2003 - 00:45 #15
Ok. Så husker jeg forkert. (meget tænkeligt) Jeg slutter her og siger mange tak.
Avatar billede segmose Nybegynder
30. maj 2003 - 11:46 #16
Eller hvis du ikke vil have en tabel.

#include "stdlib.h"
#include "stdio.h"

// bit no. 0-7
inline unsigned int reverseByte(const unsigned int src) {
  return
    ((src & 0x1)<<7)+
    ((src & 0x2)<<5)+
    ((src & 0x4)<<3)+
    ((src & 0x8)<<1)+
    ((src & 0x10)>>1)+
    ((src & 0x20)>>3)+
    ((src & 0x40)>>5)+
    ((src & 0x80)>>7);
}

int main() {
  for (unsigned int i = 0; i < 256; i++) {
    printf("%02X->%02X ", i, reverseByte(i));
    if ((i & 0x7) == 0x7)
      printf("\n");
  }
  return EXIT_SUCCESS;
}
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