Avatar billede robertmp Nybegynder
04. februar 2008 - 13:18 Der er 12 kommentarer og
1 løsning

Shift bits i en variable length string

Har en lidt mystisk opgave hvor jeg skal fjerne de første 11 bit i en string, for at få den korrekte data ud.

helt simpelt sagt en funktion der tager en string ind.
Udfører en SHL 11 på min string
Out putter den nye string.


Nogen der har en ide om hvordan jeg gør dette?
Avatar billede nca Juniormester
04. februar 2008 - 13:43 #1
NewString := Copy(OldString,12,Length(OldString));
Avatar billede hrc Mester
04. februar 2008 - 13:51 #2
result := copy(aBitString,2,MaxInt) + '0';
Avatar billede hrc Mester
04. februar 2008 - 13:52 #3
Undskyld ...

  result := copy(aBitString,12,MaxInt) + '00000000000';
Avatar billede arne_v Ekspert
05. februar 2008 - 05:13 #4
Hvis spørger har skrevet rigtigt og det er 11 bit og ikke 11 bytes, så må det være
noget a la:

function strshl(s : string; b : integer) : string;

var
  res : string;
  i, tmp : integer;

begin
  res := '';
  tmp := ord(s[1 + b div 8]) shl (b mod 8);
  for i:= 2 + b div 8 to length(s) do begin
    res := res + chr(tmp + (ord(s[i]) shr (8 - b mod 8)));
    tmp := ord(s[i]) shl (b mod 8);
  end;
  strshl := res;
end;
Avatar billede robertmp Nybegynder
05. februar 2008 - 07:58 #5
Det er helt korrekt det er 11 bit den skal flyttes. En noget underlig opgave.
Jeg skal have fjernet en 11 bit header.

Checker dit svar nu Arne V
Avatar billede robertmp Nybegynder
06. februar 2008 - 08:20 #6
Arne_v smid lige et svar tak
Avatar billede nca Juniormester
06. februar 2008 - 09:15 #7
Har du prøvet mit forslag?
Avatar billede hrc Mester
06. februar 2008 - 10:43 #8
.. eller mit, der er en afledning af nca's?

Jeg forstod umiddelbart opgaven som en parameterstreng bestående af 1'ere og nuller som funktionen udførte en SHL 11 på, men det er altså ikke sådan.
Du sender den en streng bestående af vilkårlige tegn, og det er bittene i disse du vil flytte. Når det nu er forstået synes jeg godt du kunne have beskrevet det lidt bedre - det havde nu også været lette points at hente.

Det er i øvrigt ikke den letteste funktion at bruge - den er mig noget underlig. En kort beskrivelse af s' opbygning kunne være på sin plads. Fodrer jeg den med '12345678' og shifter den 8, forventer jeg #0'1234567' men den returner '234567'.

I øvrigt kan jeg råde dit til at prøve SysTools-pakken (tidl. TurboPower, nu open source), http://sourceforge.net/projects/tpsystools/. Den indeholder bl.a. en stNVBits som jeg tror netop er hvad du skal bruge.
Avatar billede arne_v Ekspert
06. februar 2008 - 15:18 #9
'12345678' skiftet 8 bit mod venstre skal vel give '234567' ??

(#0'1234567' vil vaere skift mod venstre)
Avatar billede robertmp Nybegynder
06. februar 2008 - 21:33 #10
Copy funktionen arbejder på byte niveau. Men jeg skal flytte de individuelle bits.

f.eks er '#' ACSII værdien 35 (00100011)
Shifter jeg bit et enkelt hak mod venstre får jeg: 01000110 = decimal 70.
70's ASCII symbol er F..

Ikke helt det copy funktionen er i stand til.
Avatar billede hrc Mester
06. februar 2008 - 22:21 #11
Arne: Du har lidt ret, men jeg prøver at tegne og fortælle lidt. Hvis jeg har en stak bits

'12345678' ... eller binært

  00110001 00110010 00110011 00110100 00110101 00110110 00110111 00111000

og shifter den 8 bits til venstre må resultatet da være dette

  00110010 00110011 00110100 00110101 00110110 00110111 00111000 00000000

eller

'2345678'#0

Uanset om man shifter bittene fra 1,2,3 eller den anden vej 8,7,6.. skal den da ikke æde tegn i begge ender af strengen, vel?

Robertrmp: Du behøver ikke forklare dig - og så alligevel for nu snakker du om af flytte bittene på et enkelt tegn. Altså sådan noget i retning af dette:

  result := aInput;
  for i := 1 to length(aInput) do
    result[i] := chr(ord(result[i]) shl 1);

.. altså hvor bittene fra det enkelte tegn ikke rykker med over i næste tegn. Er det det du behøver?
Avatar billede arne_v Ekspert
07. februar 2008 - 02:52 #12
Nå - nu ser jeg hvad du mener.

For at kunne håndtere multipla af 8 så skal der tilføjes en linie:

function strshl(s : string; b : integer) : string;

var
  res : string;
  i, tmp : integer;

begin
  res := '';
  tmp := ord(s[1 + b div 8]) shl (b mod 8);
  for i:= 2 + b div 8 to length(s) do begin
    res := res + chr(tmp + (ord(s[i]) shr (8 - b mod 8)));
    tmp := ord(s[i]) shl (b mod 8);
  end;
  if (b mod 8) = 0 then res := res + chr(tmp);
  strshl := res;
end;
Avatar billede arne_v Ekspert
07. februar 2008 - 02:52 #13
og et svar
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