2017-04-12 56 views
0

我要檢索SOAP調用和SQL Server調用一些Unicode字符串。然後,我必須將所有內容都轉換爲UTF7中的字節[],以便可以通過套接字將其發送到期望UTF7字符​​串的服務器。由於我必須在每個字符串之後插入控制字節,因此我不能只串聯字符串並使用一次Encoding調用。 (簡化代碼示例):轉換幾串成一個字節[]

Encoding enc = Encoding.UTF7; 
byte[] bytes = new byte[16384]; 
int idx = 0; 
bytes[idx++] = 11; // Starting control code 

// create an array of strings from different sources. 
string[] strs = GetTheStrings(); 

foreach (string str in strs) 
{ 
    bytes[idx] = enc.GetBytes(str); // Error 

    idx += enc.GetByteCount(str); 
    bytes[idx++] = 13; // line ending CR 


} 
bytes[idx] = 28; // ending control code 

return bytes; 

我從VS中得到一個錯誤,說enc.GetBytes(str); 「不能顯式轉換類型爲byte []以字節&增加了一些關於需要重寫編碼類爲什麼VS治療字節[IDX]不同於比方說,字節[]字節2 - ?它通過串基礎上串的作品我m用於C/++,Java和許多其他語言,但C#似乎總是讓我失望。我不想使用不安全的代碼塊來使用指針來執行此操作,因爲其他人不會不知道指針和內存管理將不得不維護它,因爲字節[idx]指的是單個字節,而不是它期望的數組,是否有某種類型的演員可以用來過去呢?一個更好的方法來使用?

我已經看過十幾個站點的示例代碼,但這個多字符串的問題永遠不會顯示。我應該加載每個字符串到一個單獨的字節[],然後合併它們在 結束?

+0

無論是語言,你所提到的治療字節('字節[IDX]')作爲字節數組...你可能想從後編輯出無關的信息,以避免有關部分的討論。 –

回答

1

您正在嘗試字節數組分配給一個byte

您需要單獨分配給每個byte

var bytes = enc.GetBytes(str); 
foreach(var b in bytes) 
{ 
    bytes[idx++] = b; 
} 

之後,你不需要用idx += enc.GetByteCount(str);

+0

小心IndexOutOfRangeExceptions如果'idx'成爲> ='bytes.Length' –

+0

這就是我想,但鑑於數據的絕對數量(這是一家大醫院的許多病人都HL7 HIPAA的數據,我希望一些大量的編碼,我討厭用蠻力拼湊一些東西,但我想我必須在這裏,謝謝你確認我最害怕的恐懼;)。 – MiddleAgedMutantNinjaProgrammer

+0

我不會吹出字節[]範圍。我一次只能在套接字上發送一個病人,我可以大大增加陣列大小(它已經有50%的欺騙因子)。感謝您的警告。 – MiddleAgedMutantNinjaProgrammer

1

Encoding.GetBytes已經這樣做了更新idx大多數數據複製到同一陣列的工作適合你的,唯一需要的步驟是獲取同樣MSDN文章中涵蓋的數組大小:

要計算確切的數組大小需要由GetBytes來存儲結果字節,你應該調用GetByteCount方法。要計算最大數組大小,請調用GetMaxByteCount方法。 GetByteCount方法通常允許分配更少的內存,而GetMaxByteCount方法通常執行得更快。

只需撥打GetByteCount爲每個字符串和比調用GetBytes與增加的偏移量。

+0

你甚至不需要'GetByteCount'。這一行將做到這一點:'idx + = enc.GetBytes(str,0,str.Length,bytes,idx);' –