【delphi】Byte數組與String類型的轉換


string

  string = AnsiString = 長字符串,理論上長度不受限制,但其實受限於最大尋址范圍2的32次方=4G字節;

  變量Str名字是一個指針,指向位於堆內存的字符序列,字符序列起始於@Str[1],@Str[1]偏移負16個字節的空間存儲着字串長度、引用計數等信息。字符序列以NULL結束。

string[n]

  string[n] = ShortString = 短字符串,最多容納255個字符,實際長度是字符長度+1,是Delphi的簡單類型;

  Str[0]存儲着字符的個數,第一個字符從Str[1]開始存放,不以NULL結束。

 

  只要理解這一理論,轉string應該就不成問題了!

字節數組轉string

  把buf內容賦給ShortString

var  
  buf: array[0..100] of byte;  
  str: string[32];//僅僅開辟了一個32個空間的內存,由於第1位沒有用setlength初始化,導致長度不定  
  i  : Integer;  
begin  
 //如果在此處就對str進行賦值,str[0]位就有計數了,如果在使用之前沒有對其進行使用,用SetLength進行賦值  
  for i := 50 to 81 do buf[i] := ord('A') + i -50;//測試數據  
  SetLength(str, 32);//設置str[0]=32;  
  Move(buf[50], str[1], 32);//內存復制  
  ShowMessage (str);  
end;  

  在這里重新認識一下SetLength,SetLength有2個功能

  1. 對Short string類型進行設置長度(專門針對其第1位進行設置)
  2. 對動態數組進行設置

  把buf內容賦給AnsiString 

  stringstring[]不一樣,string是一個動態數組,還沒有分配空間,而string[]已經預分配了空間,只不過str[0]處沒賦初值,這時如果用Move的話會把Byte數組中的數據拷貝到string空間中,而string這時還沒有分配內存,肯定會造成AV錯誤) 

var  
  buf: array[0..100] of byte;  
  str: string;  
  i  : Integer;  
begin  
  for i := 50 to 81 do buf[i] := ord('A') + i -50;  
  SetLength(str, 32);  
  Move(buf[50], str[1], 32);//注意,這里是從str[1]開始復制的  
  ShowMessage (str);  
end; 

string轉為字節數組

var  
  buf: array[0..100] of byte;  
  str: string;  
  
begin  
  str:='abcdefg';  
  Move( str[1],buf[0], 32);//注意,這里是從str[1]開始復制的  
  ShowMessageFmt('$%.2d, $%.2d, $%.2d, $%.2d', [buf[3], buf[2], buf[1], buf[0]]);  
  
end;  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM