![]() |
Countbits fuer intel und non-intel bits.
Hallo zusammen, habe folgenden code, jetzt moechte ich den aber so umschreiben das er fuer intel und non-intel(BIG-endian) bits zu gebrauchen ist.
Auserdem moechte ich eine Bitrange einbauen: Startbit --> Endbit statt 0 -- > Size. Hat jemand irgendeine Ahnung wie?
Delphi-Quellcode:
Schonmal recht herzlichen Dank.
function CountBitsSet(P: Pointer; Count: Cardinal): Cardinal;
const lu : packed array[0..15] of Byte = (0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4); var b: Byte; begin Result := 0; while Count > 0 do begin b := PByte(P)^; // lower Nibble Inc(Result, lu[b and $0F]); // upper Nibble Inc(Result, lu[b shr 4]); Dec(Count); Inc(PByte(P)); end; end; Gruss Diablo |
Re: Countbits fuer intel und non-intel bits.
Zitat:
|
Re: Countbits fuer intel und non-intel bits.
Hi, der code ist Bestandteil eines eigenen torrent clients und sollte auch auf nicht Windows Machinen laufen also zb ein MAC.
|
Re: Countbits fuer intel und non-intel bits.
Heißt das, du überträgst Daten übers Internet?
Und wie wird das übertragen? Als Strings? |
Re: Countbits fuer intel und non-intel bits.
Die Function die du siehst ist dafuer gedacht zu pruefen ob eine Datei fertig gestellt wurde.
Jetzt moechte ich sie umschreiben fuer Intel 76543210 und non-intel 01234567 bits. Kleinen Ansatzcode wuerde helfen. |
Re: Countbits fuer intel und non-intel bits.
Zitat:
|
Re: Countbits fuer intel und non-intel bits.
Du hast doch schon ganz richtig erkannt, daß es CPU-Sache ist, du brauchst dich also nur darum zu kümmern, in welcher Form die Daten ankommen. Wenn du einen LongWord in Delphi hast und schnappst dir dessen Memory-Dump ist die Darstellung byteweise (nicht bit-weise) von links nach rechts (0d1 ist also 0x01000000). Trotzdem werden Rechenoperationen so durchgeführt, als ob die Byte in der "richtigen" Reihenfolge vorliegen würden. Ein SHL um 8 Bit würde also 0x00010000 ergeben. So ist das in den anderen mir bekannten Programmiersprachen auch. Auf einem Prozessor mit "richtiger" Bytereihenfolge sollte das genauso transparent sein.
Es kommt also nur darauf an, wie die Daten vorliegen und wie du sie einliest. Liegen sie in einem Stream im BigEndian-Format vor und du liest sie einfach blind in einen LongWord ein, dann kriegst du auf LittleEndian-Systemen Probleme und musst erst die Reihenfolge der Bytes umkehren (am eifnachsten wohl mit einem einfachen BSWAP). |
Re: Countbits fuer intel und non-intel bits.
Und wie koennte so ne Bitswap function aussehen deiner Meinung nach?
Waere nett wen mir jemand auf dem Weg helfen wuerde ist wichtig. Gruss Diablo |
Re: Countbits fuer intel und non-intel bits.
Für 32bit-Longwords?
Delphi-Quellcode:
function SwapLong(aValue: LongWord): LongWord; assembler;
asm BSWAP EAX; end; |
Re: Countbits fuer intel und non-intel bits.
Moin!
@tommie-lie: Hmm, wird aber wohl Probleme auf einem Mac machen, oder? MfG Muetze1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz