Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   das bit eines bytes auf 1 setzen (https://www.delphipraxis.net/154227-das-bit-eines-bytes-auf-1-setzen.html)

gangs-taas 1. Sep 2010 19:09


das bit eines bytes auf 1 setzen
 
hey,
ich versuche mich gerade an einem steganografie-programm (für die schule)
und ich komme einfach nicht mehr weiter ..

könnt ihr mir sagen, wie ich möglichst einfach & elegant ein bestimmtes bit eines bytes auf 1 setzen kann ?
wenn da ein string wäre könnte ich ja einfach machen :

Delphi-Quellcode:
i : integer ;

i[8] := 1 ;
oder sowas
aber das geht bei integer's ja nicht ...

ein bzw. das letzte bit auf Null zu setzen ist ja kein problem.
Da hab ich durch recherschieren herausgefunden, dass man einfach

Delphi-Quellcode:
i := i shr 1 ;
i := i shl 1 ;
machen kann und schon ist das letzte bit null
aber mit 1 geht das auch nicht ...

könnt ihr mir da helfen ?

(in einer facharbeit über steganografie hab ich das hier gefunden :
Delphi-Quellcode:
function setze(Value: Byte; Stelle: Byte): Byte;
begin
  case Stelle of
    1: Result:=Value or $80;
    2: Result:=Value or $40;
    3: Result:=Value or $20;
    4: Result:=Value or $10;
    5: Result:=Value or $08;
    6: Result:=Value or $04;
    7: Result:=Value or $02;
    8: Result:=Value or $01;
  else result:=0;
  end;
end;
aber ich versteh nicht was Value or $80 bedeuten soll...
ich weiß auch nicht, wie ich danach bei google suchen soll...
falls das der einfachste weg ist, könnt ihr mir erklären, was das bedeutet ? )


ich hoffe ihr könnt mir helfen ..


danke schonmal

Meflin 1. Sep 2010 19:14

AW: das bit eines bytes auf 1 setzen
 
Zitat:

Zitat von gangs-taas (Beitrag 1046816)
aber ich versteh nicht was Value or $80 bedeuten soll...

$80 ist in Delphi die Schreibweise für Hexwerte. $80 ist damit äquivalent zu binär 10000000. or ist die logische oder-Verknüpfung, wobie natürlich gilt
Code:
0 or 0 = 0
0 or 1 = 1
1 or 0 = 1
1 or 1 = 1
Value or $80 macht also nichts anderes, als das (von rechts) 8. Bit auf 1 zu setzen
Code:
Value: 100101010010
$80        10000000
or     100111010010

littleDave 1. Sep 2010 19:15

AW: das bit eines bytes auf 1 setzen
 
Wenn du dir das ganze Binär anschaust, wird es wahrscheinlich deutlicher:

$80 = 10000000 (binär)

Wenn du jetzt das erste Bit auf 1 setzen willst, passiert z.B. bei der Zahl 0 folgendes
Code:
00000000 (die 0)
   or
10000000 (die $80)
--------
10000000 ( = 128)
Das gleiche nochmal mit der Zahl (82 = $52 = 1010010 (binär))
Code:
01010010 (die 82)
   or
10000000 (die $80)
--------
11010010 ( = 210)
Hoffe, das bringt dich etwas weiter. Schau der am Besten auch mal die anderen Zahl ($40, ...) in Binär an.

[Edit] Red-Box hat wohl schon Feierabend :gruebel: [/Edit]

gangs-taas 1. Sep 2010 19:19

AW: das bit eines bytes auf 1 setzen
 
danke für die schnelle antwort
ja ihr habt mir echt geholfen
dabei hatten wir heute sogar im unterricht über xor gesprochen

ich hatte irgendwie einen denkfehler

ich dachte das Value or $80 würde heißen "gib entweder Value ODER $80 zurück"

danke :)

hathor 1. Sep 2010 21:03

AW: das bit eines bytes auf 1 setzen
 
Bit-Operationen:
http://ryulib.googlecode.com/svn/trunk/Bit.pas

DeddyH 2. Sep 2010 08:05

AW: das bit eines bytes auf 1 setzen
 
Effizientes Arbeiten mit Bitmasken

Aphton 2. Sep 2010 10:53

AW: das bit eines bytes auf 1 setzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von hathor (Beitrag 1046840)

oder...:

Delphi-Quellcode:
// demo zu "BitStream.pas"

var
  i        : Integer;
  BitStream : TBitStream;
  BitString : String;
const
  BitAsChar: Array[TBitValue] of Char = ('0', '1');
begin
  BitStream := TBitStream.Create;
  try
    BitStream.DigitCount := 32;
    { Bits setzen }
    for i := 0 to 7 do
      BitStream.Digits[i] := bitIsSet;
    BitStream.WriteWord( 8, 0 );
    BitStream.WriteByte( 24, $FF );
    { Bits auslesen und string befüllen }
    SetLength( BitString, BitStream.DigitCount );
    for i := 1 to BitStream.DigitCount do
      BitString[BitStream.DigitCount-i+1] := BitAsChar[BitStream.Digits[i-1]];
    { Ausgabe }
    ShowMessage( 'Bitstream:'#13#10 + BitString );
  finally
    BitStream.Free;
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz