因此,我有一个通过tcp进行通信的程序,服务器已经完成了,但我不知道如何将byte[]转换为字节,但如何将值保持不变。
public static List<byte[]> Separate(byte[] source, byte[] separator)
{
List<byte[]> list = new List<byte[]>();
int num = 0;
byte[] array;
for (int i = 0; i < source.Length; i++)
{
if (Equals(source, separator, i))
{
array = new byte[i - num];
Array.Copy(source, num, array, 0, array.Length);
list.Add(array);
num = i + separator.Length;
i += separator.Length - 1;
}
}
array = new byte[source.Length - num];
Array.Copy(source, num, array, 0, array.Length);
list.Add(array);
return list;
}
private static bool Equals(byte[] source, byte[] separator, int index)
{
for (int i = 0; i < separator.Length; i++)
{
if (index + i >= source.Length || source[index + i] != separator[i])
{
return false;
}
}
return true;
}
private static byte[] delimiter = Encoding.ASCII.GetBytes("<EOM>");
private static byte[] end = Encoding.ASCII.GetBytes("<EOF>");
public static IServerPacket BuildPacket(byte[] _data)
{
try
{
List<byte[]> list = new List<byte[]> { _data };
byte b = list[0].ToList().GetRange(0, 1)[0];
IServerPacket result = null;
List<byte> list2 = list[0].ToList();
list2.RemoveRange(0, 6);
list[0] = list2.ToArray();
list = Separate(Separate(list[0], end)[0], delimiter);
//printing list[0][0] here gives me 50 instead of 2
switch (b)
{
case 1:
result = new Start(1, list[0][0]);
break;
case 2:
result = new Stop();
break;
case 3:
result = new MouseEvnt(list[0][0], list[1][0], list[2], list[3], list[4][0]);
break;
case 4:
result = new KeyEvnt(list[0][0], list[1][0]);
break;
}
return result;
}
catch
{
}
return null;
}我在服务器上发送的内容:1<EOM>2<EOM>3<EOM>4<EOM>5<EOM>6<EOM>,打印列表将给我50而不是2。什么都试过了,但我就是做不到.
发布于 2022-02-28 17:04:48
您需要更多地了解,,更清楚您已经拥有的类型以及语句中每个表达式的结果类型。这个方法中的许多原始代码根本没有做任何有意义的事情,只是为了回到原来的值。问题中的任何代码都没有理由将这些字节数组转换为列表。
public static IServerPacket BuildPacket(byte[] _data)
{
byte b = _data[0];
IServerPacket result = null;
switch ((char)b)
{
case '1':
result = new Start(1, b);
break;
case '2':
result = new Stop();
break;
case '3':
result = new MouseEvnt(b, _data[1], _data[2], _data[3], _data[4]);
break;
case '4':
result = new KeyEvnt(b, _data[1]);
break;
}
return result;
}或者,您可以保留ascii值,这可能更有效:
public static IServerPacket BuildPacket(byte[] _data)
{
byte b = _data[0];
IServerPacket result = null;
switch (b)
{
case 49:
result = new Start(1, b);
break;
case 50:
result = new Stop();
break;
case 51:
result = new MouseEvnt(b, _data[1], _data[2], _data[3], _data[4]);
break;
case 52:
result = new KeyEvnt(b, _data[1]);
break;
}
return result;
}不确定事件对象,因为我看不出它们是如何工作的,但我怀疑这是非常接近的。
https://stackoverflow.com/questions/71298380
复制相似问题