Smith4400
Messages postés39Date d'inscriptiondimanche 25 janvier 2009StatutMembreDernière intervention20 août 2009
-
6 juil. 2009 à 14:31
Smith4400
Messages postés39Date d'inscriptiondimanche 25 janvier 2009StatutMembreDernière intervention20 août 2009
-
24 juil. 2009 à 12:14
salut tous le monde !!!!
j'ai un tout petit problaime avec écrire des valeurs dans un bin
mon code est...
--------------------------------------------------------
var sTemp : string;
var sId : string;
var soft: char;
begin
sTemp:=edit2.text;
soft:=chr(strtoint('$' + copy(sTemp,1,2)));
c[22]:=soft;
soft:=chr(strtoint('$' + copy(sTemp,3,2)));
c[23]:=soft;
Write(F,C);
CloseFile(F);
end
end;
------------------------------------------------------
ce code fonctionne normal mais moi je veux écrire tous une chaine une fois pour toute et pas a chaque foix je récrit c[22] et apres c[23] et apres c[24]
je vous t'attends
merci
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 9 juil. 2009 à 00:50
on se demande pourquoi je me suis cassé la nouille a mettre des commentaires aux fonctions ...
var K : integer;
B : TBin;
TFS : TFileStream;
begin
Edit1.Test := 'FF12EE34DD56CC78BB90AA';
K := StrToBin(Edit1.Text, B);
if K > 0 then
begin
TFS := TFileStream.Create('c:\test.bin', fmCreate);
try
WriteBinToStream(TFS, B, K);
finally
TFS.Free;
end;
end;
end;
type
p2Bytes = ^T2Bytes;
T2Bytes = array[0..1] of byte;
TBin = array[0..MaxBinLength-1] of byte;
{ StrToBin
convertis une chaine qui represente une valeur hexa decimale en sa representation
binaire (tableau de bytes).
la taille maximale de ce tableau est donnée par la constante MaxBinLength,
la taille maximale de la chaine entrante est donnée par la constante MaxBinStrLength
PARAMETRES :
S [I] AnsiString, chaine representant une valeur hexadecimale
Bin [O] TBin (Tableau de bytes), valeur binaire de la chaine
RETOUR :
integer, renvois la taille ecrite dans Bin ou code erreur (<= 0)
0 : S est vide
-2 : S n'as pas une taille valide (doit etre multiple de 2) : F est mauvais, 0F est ok
-1 : la taille de S depasse la capacité du buffer (MaxBinLength)
-3 : S possede des caracteres invalide (n'est pas dans 0123456789ABCDEFabcdef)
}
function StrToBin(const S : AnsiString; var Bin : TBin): integer;
var pW : p2Bytes;
N, L : integer;
W1, W0 : integer;
begin
result := 0;
if S = EmptyStr then
exit;
pW := @S[1];
L := Length(S);
if (L and $1) = $1 then
begin
result := -2;
exit;
end;
result := L shr 1;
if result > MaxBinLength then
begin
result := -1;
exit;
end;
for N := 0 to result-1 do
begin
W0 := pW^[0];
W1 := pW^[1];
case W0 of
$30..$39 : dec(W0, $30);
$41..$46 : dec(W0, $37);
$61..$66 : dec(W0, $57);
else
result := -3;
exit;
end;
case W1 of
$30..$39 : dec(W1, $30);
$41..$46 : dec(W1, $37);
$61..$66 : dec(W1, $57);
else
result := -3;
exit;
end;
Bin[N] := byte((W0 shl 4) or W1);
inc(pW);
end;
end;
{ BinToStr
Convertis un ensemble de valeurs binaire (TBin) en une chaine lisible. Sont fonctionnement
est inverse a celui de StrToBin.
PARAMETRES :
Bin [I] TBin, ensemble de valeurs binaire
BinSize [I] Integer, taille de l'ensemble de valeurs
HexLowerCase [I] boolean, indique si il faut utiliser les caracteres minuscules (true) ou
majuscules (false).
RETOUR :
AnsiString, chaine contenant la representation textuelle des valeurs binaire contenues dans Bin.
vide si BinSize <= 0.
}
function BinToStr(const Bin : TBin; const BinSize: integer; const HexLowerCase: boolean = true): AnsiString;
var pW : p2Bytes;
N : integer;
BI, BH, BL : byte;
const
BIVAL : array[boolean] of byte = ($37, $57);
begin
if BinSize = 0 then
exit;
for N := 0 to BinSize-1 do
begin
BH := Bin[N] shr 4;
BL := Bin[N] and $F;
case BH of
$0..$9 : inc(BH, $30);
$A..$F : inc(BH, BI);
end;
case BL of
$0..$9 : inc(BL, $30);
$A..$F : inc(BL, BI);
end;
pW^[0] := BH;
pW^[1] := BL;
inc(pW);
end;
end;
{ ReadBinFromStream
lit les octets d'un flux et les places dans un tableau TBin.
PARAMETRES :
Stream [I] TStream, Instance valide d'une classe TStream
Bin [O] TBin, contient les octets luts du flux
BinSize [I] BinSize, nombres d'octets a lire
RETOUR :
integer, renvois le nombre d'octets copiés dans Bin (>= 1)
0 : BinSize est definit a 0 ou inferieur a 0
-1 : Stream invalide, pas instancié (create)
}
function ReadBinFromStream(Stream: TStream; var Bin: TBin; const BinSize: integer): integer;
begin
result := 0;
if BinSize <= 0 then
exit;
if not assigned(Stream) then
begin
result := -1;
exit;
end;
result := Stream.Read(Bin[0], BinSize);
end;
{ WriteBinToStream
Ecrit les octets contenus dans un tableau TBin dans un flux
PARAMETRES :
Stream [I/O] TStream, Instance valide d'une classe TStream
Bin [I] TBin, contient les octets a ecrire dans le flux
BinSize [I] BinSize, nombres d'octets a ecrire
RETOUR :
integer, renvois le nombre d'octets ecrit dans le flux (>= 1)
0 : BinSize est definit a 0 ou inferieur a 0
-1 : Stream invalide, pas instancié (create)
}
function WriteBinToStream(Stream: TStream; const Bin: TBin; const BinSize: integer): integer;
begin
result := 0;
if BinSize <= 0 then
exit;
if not Assigned(Stream) then
begin
result := -1;
exit;
end;
Smith4400
Messages postés39Date d'inscriptiondimanche 25 janvier 2009StatutMembreDernière intervention20 août 2009 18 juil. 2009 à 23:33
f0xi
merci c très utiles + ça marche très bien
mais comment peux-je ouvrir le fichier sans l'écraser ??
car je veux juste écrire la table et pas faire un nouveau fichier et écrire dans...
merci infiniment
Smith4400
Messages postés39Date d'inscriptiondimanche 25 janvier 2009StatutMembreDernière intervention20 août 2009 20 juil. 2009 à 09:18
f0xi
merci j'ai trouvé la répence correct
merci merci merci
---------------------------------
une autre chose
je veux chercher l'offset de des donnée que j'ai écris,j'ai trouvé une fonction
----------------------------------
ScanFile searches for a string in a file and returns the position of the string
in the file or -1, if not found.
ScanFile sucht in einer Datei nach dem Vorkommen
eines bestimmten Strings und gibt bei Erfolg die Position zurück, wo der String
gefunden wurde.
}
function ScanFile(const FileName: string;
const forString: string;
caseSensitive: Boolean): Longint;
const
BufferSize = $8001; { 32K+1 bytes }
var
pBuf, pEnd, pScan, pPos: PChar;
filesize: LongInt;
bytesRemaining: LongInt;
bytesToRead: Integer;
F: file;
SearchFor: PChar;
oldMode: Word;
begin
{ assume failure }
Result := -1;
if (Length(forString) 0) or (Length(FileName) 0) then Exit;
SearchFor := nil;
pBuf := nil;
{ open file as binary, 1 byte recordsize }
AssignFile(F, FileName);
oldMode := FileMode;
FileMode := 0; { read-only access }
Reset(F, 1);
FileMode := oldMode;
try { allocate memory for buffer and pchar search string }
SearchFor := StrAlloc(Length(forString) + 1);
StrPCopy(SearchFor, forString);
if not caseSensitive then { convert to upper case }
AnsiUpper(SearchFor);
GetMem(pBuf, BufferSize);
filesize := System.Filesize(F);
bytesRemaining := filesize;
pPos := nil;
while bytesRemaining > 0 do
begin
{ calc how many bytes to read this round }
if bytesRemaining >= BufferSize then
bytesToRead := Pred(BufferSize)
else
bytesToRead := bytesRemaining;
{ read a buffer full and zero-terminate the buffer }
BlockRead(F, pBuf^, bytesToRead, bytesToRead);
pEnd := @pBuf[bytesToRead];
pEnd^ := #0;
pScan := pBuf;
while pScan < pEnd do
begin
if not caseSensitive then { convert to upper case }
AnsiUpper(pScan);
pPos := StrPos(pScan, SearchFor); { search for substring }
if pPos <> nil then
begin { Found it! }
Result := FileSize - bytesRemaining +
Longint(pPos) - Longint(pBuf);
Break;
end;
pScan := StrEnd(pScan);
Inc(pScan);
end;
if pPos <> nil then Break;
bytesRemaining := bytesRemaining - bytesToRead;
if bytesRemaining > 0 then
begin
Seek(F, FilePos(F) - Length(forString));
bytesRemaining := bytesRemaining + Length(forString);
end;
end; { While }
finally
CloseFile(F);
if SearchFor <> nil then StrDispose(SearchFor);
if pBuf <> nil then FreeMem(pBuf, BufferSize);
end;
------------------------
mais elle cherche le type "string" et les données que je cherche sont "integer"