2015-10-16 23 views
-4

C#如果我現在是在bytes那麼我將其轉換成string那麼什麼將是這個內存以及如何同時使用可變的大型字符串做更好的內存管理的影響表單數據的4-5 GB內存管理如何在字節和字符串之間工作?

代碼

public byte[] ExtractMessage(int start, int end) 
    { 
     if (end <= start) 
      return null; 

     byte[] message = new byte[end - start]; 
     int remaining = Size - end; 

     Array.Copy(Frame, start, message, 0, message.Length); 

     // Shift any remaining bytes to front of the buffer 
     if (remaining > 0) 
      Array.Copy(Frame, end, Frame, 0, remaining); 

     Size = remaining; 
     ScanPosition = 0; 

     return message; 
    } 



    byte[] rawMessage = Buffer.ExtractMessage(messageStart, messageEnd); 

    // Once bytes are received, I want to create an xml file which will be used for further more work 

string msg = Encoding.UTF8.GetString(rawMessage); 

CreateXMLFile(msg); 

public void CreateXMLFile(string msg) 
     { 
      string fileName = "msg.xml"; 
      if (File.Exists(fileName)) 
      { 
       File.Delete(fileName); 
      } 
      using (File.Create(fileName)) { }; 

      TextWriter tw = new StreamWriter(fileName, true); 
      tw.Write(msg); 
      tw.Close(); 
     } 
+2

一個**很多**的上下文在這裏是缺少的。 –

+0

我只是想知道字節和字符串之間的內存管理,所以我沒有顯示任何代碼。請不要反對,如果你有知識分享 – Gaurav123

+2

這是你需要的第一點知識:**這取決於語言。** –

回答

2
.NET

串被存儲爲Unicode,這意味着每個字符使用兩個字節。在使用UTF8時,轉換爲字符串時會增加內存使用量。

將文本轉換爲string後,除非您嘗試修改它,否則不會發生任何更改。 string對象是不可變的,這意味着每次使用其中一種方法(如Remove())對其進行修改時,都會創建一個新的字符串副本。

你可以在這裏閱讀更多:How are strings passed in .NET?

的字節數組但是總是被引用傳遞,每一個變化都會影響到所有變量抱着它。因此,更改不會影響性能/內存消耗。您可以使用var buffer = yourEncoding.GetBytes(yourString);從字符串中獲得byte[]。通用編碼可以使用靜態變量來訪問:var buffer= Encoding.UTF8.GetBytes(yourString);

+0

這是不正確的 - 字符串中。NET是Unicode,即每個字符2個字節,而原始緩衝區包含1到4個字節的UTF-8編碼文本。 –

+0

@PanagiotisKanavos:是。沒有檢查他是如何存儲陣列的。將更新答案。 – jgauffin

0

我假設this回答你的問題。我發現這question會有一些使用

+0

僅鏈接答案沒有幫助。什麼回答這個問題,爲什麼? –

相關問題