在做結構體向字節數組轉換的時候,常遇到"傳遞給系統調用的數據區域太小"的錯誤,究其原因是因為英文與漢字的編碼方式不同,一個漢字等於兩個字節,而一個英文字母等於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);
