18. oktober 2000 - 12:23Der er
33 kommentarer og 1 løsning
Binær værdi i registreringsdatabasen
Hej
Jeg skal bruge en procedure til at tilføje en binær værdi til registreringsdatabasen.
Hvis vi siger, at jeg f.eks. har værdien 001111100110011000111000, hvordan skal den så tilføjes, så den kommer til at stå på helt samme måde, når jeg kigger i registreringsdatabasen.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
Hvordan læser du værdien \"001111100110011000111000\" ?
Hvis det er 3 bytes så kan du skrive det som en streng der er 3 bytes lang via \"WriteString\" eller også kan du bruge \"WriteBinaryData\": <SNIP> Stores a specifically named data value associated with the current key.
procedure WriteBinaryData(const Name: String; var Buffer; BufSize: Integer);
Description
Call WriteBinaryData to store a data value associated with the current key.
Name is a string containing the name of the data value in which to store data. If Name already exists, its current value is overwritten by WriteBinary. If Name does not exist, it is created.
Buffer is a data buffer containing the data to store in the registry. BufSize indicates the size of Buffer.
Note: Data-value lengths are limited by available memory. Long values (more than 2048 bytes) should be stored as separate files, and those file names should be stored in the registry. Application elements such as icons, bitmaps, and executable files should be stored as separate files rather than as values in the registry.
If WriteBinaryData fails, an exception is raised, and the value is not written to the registry. </SNIP>
vil du tilføje strengen \"001111100110011000111000\" eller værdien 4089400? Du har 3 muligheder gemme det som en streng med 0 & 1, gemme værdien en DWORD (det jo også binært) eller bruge BINARY hvor du kan kan størrere mængder af data, hvor kan jeg ikke huske.
Jeg går f.eks. ind i registreringsdatabasen og vælger en vilkårlig binær værdi. Den vil jeg så tilføje under en anden nøgle, så den bliver helt magen til.
Jeg har prøvet med:
type TRegVaerdi = record Value : ShortString; end;
Ovenstående er en streng hvor værdierne tilfældigvis er ASCII 0\'er og ASCII 1\'er det har principielt ikke noget med \"binær værdier\" at gøre. Hvis du i stedet vil regne ovenstående 0\'er og 1\'er som binære værdier så får du 3 tegn.
Jammen så prøv det her for at kopiere dit password til et andet sted i registerings database.
var Data : Array of Byte; // Dynamic Array - Delphi4 Only !! sz : Word;
procedure TForm1.Button1Click(Sender: TObject); const Key : String = \'Software\\Microsoft\\Internet Account Manager\\Accounts\\00000001\'; Val : String = \'POP3 Password2\'; begin with TRegistry.Create do try OpenKey(Key, False); if GetDataType(Val) = rdBinary then begin sz := GetDataSize(Val); if sz > 0 then begin SetLength(Data, sz); ReadBinaryData(Val, Data[0], sz); end; end; finally free; end; end;
procedure TForm1.Button2Click(Sender: TObject); const Key : String = \'Software\\Hest\'; Val : String = \'POP3 Password2\'; begin with TRegistry.Create do try OpenKey(Key, True); WriteBinaryData(Val, Data[0], sz); CloseKey; finally Free; end; end;
Det er i væsenlige grad også tager der fra .... Men som den opmærksomme læser også allerede har bemærket så har jeg været i gang med problemer i et tidligere spm.
Hvis man så får vist en smartere metode end dem man allerede kender ... så ville det være dumt ikke at benytte den ....
Det oprinde lige spørgsmål gik på hvordan man kopiere en binær værdi i registeringsdatabasen....
Lige inden TeleDK skodede min Internetforbindelse ville jeg havde sagt: Jeg samler lige mine to svar: <SNIP> var acData : Array[0..2] of byte; begin acData[0] := 62; acData[1] := 102; acData[2] := 56; RegBlaBla.WriteBinaryData(\'Nøgle\', acData, 3); end; </SNIP>
Her betaler man en halv til en helv arm for en 2 MBit forbindelse og så dør den bedst som man er ved at poste et svar. Jeg klippede det over i en notepad så jeg ikke skulle skrive det igen da der endelig kom forbindelse igen.
Borrisholt>> Jeg har kun Delphi 3, så det kan ikke bruges. Jeg får først version 4 i næste måned, når alt om data bringer fuld version af Delphi 4 med bladet.
Den anden kode ser ud til at virke, der er bare et MEN: Når jeg aflæser en værdi i registreringsdatabasen, f.eks. 38(HEX) / 00111000(BIN), er det jo ikke i DEC. Dvs. at hvis jeg vil have 38 i reg.db. skal de først koverteres til Decimaltal, hvor det giver 56. Hvis jeg så sætter 56 ind i jeres forslag, giver det de 38.
Denne omregningsproces skal ikke ske manuelt, så hvordan kan man regne HEX-værdien i reg.db. om til BYTE-værdien i Delphi-koden?
Der sker ingen konvertering hverken den ene eller den anden vej. Det hele er et sprøgsmål om hvordan du vælger at læse værdien. Du kan ikke sige at regisrerings database har værdien $38(HEX) det er lige så rigtigt at sige at den har værdien %00111000(BIN) eller #56(DEC). RegEdit vælger bare at vise den som HEX.
Det store spørgsmål er \"Hvad vil du\" og \"hvad kender du\". Hvis du ved at du vil skrive værdien $38 så kan du vælge at skrive: acData[2] := $38;
Her er proceduren: ------------------------------------------------ procedure TForm1.Button2Click(Sender: TObject); var B : array [0..19] of Byte; I : Byte; R: TRegistry; str: string; Const SubKey : String = \'Software\\Hest\';
begin R := TRegistry.Create; str:=\'0102380036004400310038003600320030000000\';
with R do begin for i:=0 to 19 do begin B[I]:=StrToInt(\'$\'+str[I+I+1]+str[I+2+I]); end; OpenKey(SubKey + \'\\tester\', True); WriteBinaryData(\'Value\', B, SizeOf(B)); Free; end; end; -----------------------------------------------
MEN hvis nu jeg vil tage STR fra en tekstfil, og den ikke altid har samme længde, er der så nogen løsning at hente, når Delphi3 ikke kan bruge dynamisk array?
jammen du læser bare længden på din streng. ganse almindeligt med Length()
fx :
procedure TForm1.Button3Click(Sender: TObject); var i,j : Integer; str,tmp : String; buf : array of Byte;
Const SubKey : String = \'Software\\Hest\'; begin str:=\'0102380036004400310038003600320\'; //(læst fra en fil) i:= Length(str); Getmem(buf, i); for j:= 0 to i div 2 do begin tmp := \'$\'+str[j+j+1]+str[j+2+j]; buf[j] := StrToInt(tmp); end;
with TRegistry.Create do try OpenKey(SubKey + \'\\tester\', True); WriteBinaryData(\'Value\', Buf, SizeOf(Buf)); finally closekey; free; end;
Med hiv og sving og med hjælp fra Pelle (pellelil) er jeg kommer frem til den følgende løsning :
type CharSet = set of char; Const SubKey : String = \'Software\\Hest\\tester\'; Val : String = \'randomValue\';
Function StripButCharSet(Const szStr : String; ChSet : CharSet) : String; var iLen : Integer; iIdx : Integer; begin Result := \'\'; iLen := Length(szStr); if iLen > 0 then for iIdx := 1 to iLen do if (szStr[iIdx] in ChSet) then Result := Result + szStr[iIdx]; end;
Function Hex2Int(szHex : String) : Integer; Const acHexTable : Array[0..15] of char = \'0123456789ABCDEF\'; var iIdx : Integer; begin Result := 0; szHex := StripButCharSet(AnsiUpperCase(szHex), [\'0\'..\'9\',\'A\'..\'F\']); for iIdx := 1 to Length(szHex) do begin Result := Result or (Pos(szHex[iIdx], acHexTable)-1); if iIdx < Length(szHex) then Result := Result shl 4; end; end;
Function StrToBin(s : String) : Boolean; var i,j : Integer; qq : array[0..1023] of byte; Reg : TRegistry; begin Result := false; try s:= StripButCharSet(s,[\'0\' .. \'9\', \'A\' .. \'F\']);
if length(s) mod 2 <> 0 then s:= \'0\' + s;
j := Length(s) div 2;
for i:= 0 to j do qq[i] := Hex2Int(s[i+i+1]+s[i+i+2]);
Du kan selv give nogle point til Pelle, alt efter hvor meget han har hjulpet...
>>AASuper :)
Synes godt om
Ny brugerNybegynder
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.