在做結構體向字節數組轉換的時候,常遇到"傳遞給系統調用的數據區域太小"的錯誤,究其原因是因為英文與漢字的編碼方式不同,一個漢字等於兩個字節,而一個英文字母等於1個字節。所以,對於如下的結構體:
/// <summary> /// 報警協議數據區結構 /// </summary> [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] public struct DataAreaForAlarmAsk { /// char[20] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 20)] public char[] szAlarmNo; /// char[10] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 10)] public char[] szUserNo; /// char[100] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst = 100)] public string szUserName;
。。。}
對於szUserName,用戶姓名,在國內的系統中,極可能就含有中文字母,那么我們獲取時,務必將字符串長度折半,即50,具體如下
//用戶名稱 alarmProtoAlarmAsk.dataAreaForAsk.szUserName = (alarm_user_name.Length < 50) ? alarm_user_name : alarm_user_name.Substring(0, 50);