BitConverter.ToInt16()产生意外结果

本文关键字:意外 结果 ToInt16 BitConverter | 更新日期: 2023-09-27 18:21:35

我有以下关于处理移动的跳棋游戏函数的代码:

public void convertMoveToIntValues(KeyValuePair<string, string> move, ref Int16 fromNumInt, ref Int16 toNumInt) {
    Byte[] fromNumTemp = { 0, 0 };
    Byte[] fromNum = {0,0,0,0};
    fromNumTemp = Encoding.ASCII.GetBytes(move.Key);
    fromNumTemp[0] -= 96;
    fromNumTemp[1] -= 48;
    fromNum[1] = fromNumTemp[0];
    fromNum[3] = fromNumTemp[1];
    fromNumInt = (Int16)(BitConverter.ToInt16(fromNum, 0) * 8 + BitConverter.ToInt16(fromNum, 2)); 
    Byte[] toNumTemp = {0,0};
    Byte[] toNum = { 0, 0, 0, 0 };
    toNumTemp = Encoding.ASCII.GetBytes(move.Value);
    toNumTemp[0] -= 96;
    toNumTemp[1] -= 48;
    toNum[1] = toNumTemp[0];
    toNum[3] = toNumTemp[1];
    toNumInt = (Int16)(BitConverter.ToInt16(toNum, 0) * 8 + BitConverter.ToInt16(toNum, 2));
}
public void Main() {
    Int16 a, b;
    convertMoveToInt(New KeyValuePair<string, string>("c3","b4"), a, b);
   Console.Writeline("The puppet moves from place no. " + a + " to place no. " + b);
}

我得到了错误的解决方案,比如:a=6912和b=5120。

我使用两种Byte[],第一种用于ASCII到Byte的转换,另一种用于Byte到Int16的转换。该主题的一个很好的参考是:https://msdn.microsoft.com/en-us/library/system.bitconverter.toint16(v=vs.110).aspx

所有的事情都很顺利,直到最后一行,它产生了不正确的结果。

你能帮我得到正确的答案吗?

BitConverter.ToInt16()产生意外结果

我想你可能想要:

toNum[0] = toNumTemp[0];
toNum[2] = toNumTemp[1];

而不是:

toNum[1] = toNumTemp[0];
toNum[3] = toNumTemp[1];

(我还建议您编写一个接收string并返回Int16的方法,以避免您两次编写相同的代码)

现在我正在对这段代码进行一些更改,但实际上它并没有真正起作用。我有一张有8列8行的国际象棋表。从左下角的a1开始到右上角的h8开始的正式计数。在代码中,我将这些数据表示在一个数组中,该数组实际上从表的左上角开始,到表的右下角结束。因此,从给定的字母数字数据中获取寻址数组所需的数据是一件很棘手的事情。我请你复习一下以下将字母数字值转换为数组地址的方法,因为我会突然进入一个糟糕的阶段(有时是4个单元格对,而其他时候只有2个单元格对)。

谢谢!

public void convertMoveToIntValues(KeyValuePair<string, string> move, ref Int16 fromNumInt, ref Int16 toNumInt)
{
    Int16 temp0, temp1;
    Byte[] fromNumTemp = { 0, 0 };
    Byte[] fromNum = {0,0,0,0};
    fromNumTemp = Encoding.ASCII.GetBytes(move.Key);
    fromNumTemp[0] -= 97;
    fromNumTemp[1] -= 49;
    fromNum[0] = fromNumTemp[0];
    fromNum[2] = fromNumTemp[1];
    temp0 = (Int16)(56 - (Int16)(BitConverter.ToInt16(fromNum, 2) * 8 + BitConverter.ToInt16(fromNum, 0)));
    fromNumInt = (temp0 > 0) ? temp0: (Int16)(-1 * temp0); 
    Byte[] toNumTemp = {0,0};
    Byte[] toNum = { 0, 0, 0, 0 };
    toNumTemp = Encoding.ASCII.GetBytes(move.Value);
    toNumTemp[0] -= 97;
    toNumTemp[1] -= 49;
    toNum[0] = toNumTemp[0];
    toNum[2] = toNumTemp[1];
    temp1 = (Int16)(56 - (Int16)(BitConverter.ToInt16(toNum, 2) * 8 + BitConverter.ToInt16(toNum, 0)));
    toNumInt = (temp1 > 0) ? temp1: (Int16)(-1 * temp1);
}