2016-07-27 74 views
-2

我知道在Delphi 7中,AnsiString類型是1個字節,但在Delphi 2010中,UnicodeString類型是2個字節。在Delphi 2010中將1個字符轉換爲1個字節

下面的代碼是運作良好的Delphi 7

var 
    FS: TFileStream; 
    BinarySize: integer; 
    FreeAvailable, TotalSpace: int64; 
    fname: string; 
    StringAsBytes: array of Byte; 
begin 
    .............. 
    FS := TFileStream.Create(drive+'\'+fname+'.BIN', fmOpenReadWrite or fmShareDenyWrite); 
    try 
     BinarySize := (Length(fname) + 1) * SizeOf(Char); 
     SetLength(StringAsBytes, BinarySize); 
     Move(fname[1], StringAsBytes[0], BinarySize); 

     FS.Position:=172903; 
     FS.WriteBuffer(StringAsBytes[0], Length(StringAsBytes)); 
     FS.Position:=173111; 
     FS.WriteBuffer(StringAsBytes[0], Length(StringAsBytes)); 
     FS.Position:=173235; 
     FS.WriteBuffer(StringAsBytes[0], Length(StringAsBytes)); 
     FS.Position:=173683; 
     FS.WriteBuffer(StringAsBytes[0], Length(StringAsBytes)); 
     FS.Position:=173695; 
     FS.WriteBuffer(StringAsBytes[0], Length(StringAsBytes)); 
    finally 
     FS.Free; 
    end; 
end; 

,但它並不適用於2010年德爾福工作,請幫幫忙!

+2

你知道爲什麼它不工作。那裏有這麼多的資源。你有沒有努力去理解這個? –

+0

http://docwiki.embarcadero.com/VCL/2010/en/SysUtils.TEncoding.GetBytes和http://docwiki.embarcadero.com/VCL/2010/en/SysUtils.TEncoding_Properties –

+0

我也有使用'StringAsBytes := TEncoding.ASCII.GetBytes(fname);'我檢查了十六進制代碼,一切正常,但事實上,這是不正確 – nguyentu

回答

0

如果您不需要支持Unicode的字符數,我會使其明確使用ANSIChar類型/ AnsiString類型更改:

var 
    FS: TFileStream; 
    BinarySize: integer; 
    FreeAvailable, TotalSpace: int64; 
    fname: AnsiString; 
    StringAsBytes: array of Byte; 
begin 
    .............. 
    FS := TFileStream.Create(drive+'\'+fname+'.BIN', fmOpenReadWrite or fmShareDenyWrite); 
    try 
     BinarySize := (Length(fname) + 1) * SizeOf(AnsiChar); 
     SetLength(StringAsBytes, BinarySize); 
     Move(fname[1], StringAsBytes[0], BinarySize); 

     FS.Position:=172903; 
     FS.WriteBuffer(StringAsBytes[0], Length(StringAsBytes)); 
     FS.Position:=173111; 
     FS.WriteBuffer(StringAsBytes[0], Length(StringAsBytes)); 
     FS.Position:=173235; 
     FS.WriteBuffer(StringAsBytes[0], Length(StringAsBytes)); 
     FS.Position:=173683; 
     FS.WriteBuffer(StringAsBytes[0], Length(StringAsBytes)); 
     FS.Position:=173695; 
     FS.WriteBuffer(StringAsBytes[0], Length(StringAsBytes)); 
    finally 
     FS.Free; 
    end; 
end; 
+0

這不起作用,'Length (StringAsBytes)= Length(fname)+ 1' – nguyentu

+0

@nguyentu:如果'StringAsBytes'預計爲空終止,它將工作。 +1爲空終止符保留空間,'SetLength()'零初始化緩衝區內存,'Move()'不覆蓋保留的終止符。 –

+1

無論如何,'StringAsBytes'是多餘的,可以刪除。 'AnsiString'可以直接傳遞給'WriteBuffer()'例如:'FS.WriteBuffer(PAnsiChar(fname)^,Length(fname));',或者你需要寫空終止符:'FS .WriteBuffer(PAnsiChar(fname)^,Length(fname)+1);' –

相關問題