3 回答

TA貢獻2016條經驗 獲得超9個贊
您似乎對字符串編碼有問題??紤]以下測試代碼:
unsafe
{
InfoDetails d;
var encoding = Encoding.Unicode;
var stringBytes = encoding.GetBytes("TEZ");
for(int i=0; i<stringBytes.Length; i++) d.Name[i] = (sbyte)stringBytes[i];
Console.WriteLine(d.getName);
}
您確實會得到“T”,但是如果您將編碼更改Encoding.ASCII為預期的“TEZ”。
解決方法:需要事先知道信息的編碼,并據此生成字符串??雌饋硭?Unicode,所以先試試這個:
fixed (sbyte* namePtr = Name)
{
return new string(namePtr, 0, 50, Encoding.Unicode);
}

TA貢獻1799條經驗 獲得超6個贊
他們幫助我找到了一個可行的解決方案。我真的不知道它是否是最好的:
[StructLayout(LayoutKind.Explicit)]
public unsafe struct InfoDetails
{
[FieldOffset(0x14)]
public fixed byte Name[50];
public string test
{
get
{
List<byte> clearBytes = new List<byte>();
fixed (byte* namePtr = Name)
{
for (int i = 0; i < 50; i++)
{
if (namePtr[i] == 0x0 && namePtr[i + 1] == 0x0)
{
break;
}
clearBytes.Add(namePtr[i]);
}
if (clearBytes.Count() % 2 != 0)
{
clearBytes.Add(0x00);
}
return Encoding.Unicode.GetString(clearBytes.ToArray());
}
}
}
}
- 3 回答
- 0 關注
- 344 瀏覽
添加回答
舉報