首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c#将byte[]转换为字节,但值保持不变

c#将byte[]转换为字节,但值保持不变
EN

Stack Overflow用户
提问于 2022-02-28 16:51:30
回答 1查看 68关注 0票数 -2

因此,我有一个通过tcp进行通信的程序,服务器已经完成了,但我不知道如何将byte[]转换为字节,但如何将值保持不变。

代码语言:javascript
复制
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。什么都试过了,但我就是做不到.

EN

回答 1

Stack Overflow用户

发布于 2022-02-28 17:04:48

您需要更多地了解,更清楚您已经拥有的类型以及语句中每个表达式的结果类型。这个方法中的许多原始代码根本没有做任何有意义的事情,只是为了回到原来的值。问题中的任何代码都没有理由将这些字节数组转换为列表。

代码语言:javascript
复制
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值,这可能更有效:

代码语言:javascript
复制
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;
}

不确定事件对象,因为我看不出它们是如何工作的,但我怀疑这是非常接近的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71298380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档