将字节合并为逻辑值

时间:2015-06-01 20:21:24

标签: c# byte

我以(预期)以下格式获取数据:

\u0001\u0001\u0004\0\u0001\0\0\0

每个段代表一个字节。前两个段\u0001\u0001表示服务版本号,后两个\u0004\0表示状态代码,最后4个u0001\0\0\0等于请求ID。

如何将我知道的字段放在一起并从结果中获取逻辑值?例如,状态代码\u0004\0应为signed-short,请求ID应为int。

我玩过什么,但我不知道有效性:

byte s1 = 0004;
byte s2 = 0;
short statusCode = (short)(s1 | (s2 << 8));

byte r1 = 0001;
byte r2 = 0;
byte r3 = 0;
byte r4 = 0;

int requestId = (int)(r1 | (r2 << 8) | (r3 << 16) | (r4 << 24));

2 个答案:

答案 0 :(得分:2)

虽然您的逻辑看起来很好,但手动位移可能变得非常繁琐,尤其是当您需要处理的数据量增加时。对于8个字节来说这很简单,但对于其他所有内容,我建议你直接将编组字节放入对象中。

为此,请定义一个解释数据的值类型:

public struct Data
{
    public short serviceVersion;
    public short statusCode;
    public int requestId;
}

然后,您可以将字符串转换为字节数组,并将其编组为Data对象:

// raw input, as a string
string s = "\u0001\u0001\u0004\0\u0001\0\0\0";

// convert string into byte array
byte[] bytes = Encoding.UTF8.GetBytes(s);

// interpret byte array as `Data` object
GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
Data data = (Data)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Data));
handle.Free();

// access the data!
Console.WriteLine(data.serviceVersion); // 257
Console.WriteLine(data.statusCode); // 4
Console.WriteLine(data.requestId); // 1

答案 1 :(得分:0)

在@ poke上面的帖子中豁免;如果你想真正想要你可以做info: [ { firstname: "-", lastname: "-", age: "-" } ] 效果

union

使用using System.Runtime.InteropServices; [StructLayout(LayoutKind.Explicit, Size = 8)] public struct Data { [FieldOffset(0)] public short serviceVersion; [FieldOffset(2)] public short statusCode; [FieldOffset(4)] public int requestId; [FieldOffset(0)] public ulong Value; } 字段读取您关心的所有位。

此外,使用Data.Value可以避免编组。

unsafe