我以(预期)以下格式获取数据:
\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));
答案 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