【发布时间】:2019-10-16 23:10:06
【问题描述】:
我正在一个非常旧的系统上从多播流中收集二进制信息。我已经转换了大部分,但我遇到了高/低 DWORD 组合的问题。我写了一个小测试应用程序来尝试解决这个问题。我被告知该值应在 30XXX 范围内。
给我的文档说它被定义为...
DWORD ID_HIGH;
DWORD ID_LOW;
到目前为止,我只是得到垃圾。我尝试了位移位和许多其他路线。到目前为止,没有运气。感谢您提供任何帮助。
static void Main(string[] args)
{
byte[] data = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x04, 0x51};
Int32 ID_High = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(data, 0));
Int32 ID_Low = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(data, 4));
Int64ToInt32 i6;
i6.Int64Value = 0;
i6.LeftInt32 = ID_High;
i6.RightInt32 = ID_Low;
}
[StructLayout(LayoutKind.Explicit)]
struct Int64ToInt32
{
[FieldOffset(0)]
public Int64 Int64Value;
[FieldOffset(0)]
public Int32 LeftInt32;
[FieldOffset(4)]
public Int32 RightInt32;
}
了解更多信息。这是从多播接收到的整个 byte[]。
byte[] data = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x04, 0x51, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x04, 0x50, 0x00, 0x00, 0x04, 0x7F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x90, 0x3E, 0xE4, 0x62, 0xB8, 0xB1, 0x4D, 0xB0, 0xF1, 0x15, 0x94,
0xF1, 0x13, 0x0F, 0x84, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00 };
这是它应该翻译成的定义。
typedef struct
{
DWORD AgentID_High; // Agent phoneset login ID high-order 32 bits
DWORD AgentID_Low; // Agent phoneset login ID low-order 32 bits
DWORD State;
DWORD SupervisorID_High; // Supervisor phoneset login ID high-order 32 bits
DWORD SupervisorID_Low; // Supervisor phoneset login ID low-order 32 bits
DWORD TimeInState;
DWORD AnsweringSkillset;
DWORD DNInTimeInState;
DWORD DNOutTimeInState;
BYTE SupervisorUserID[16];
DWORD PositionID;
// TM26314
DWORD NotReadyReasonCode_High;
DWORD NotReadyReasonCode_Low;
DWORD DNOutCallNumber_High;
DWORD DNOutCallNumber_Low;
DWORD SkillsetCallAnswered;
DWORD DNInCallAnswered;
DWORD DNOutCallMade;
//Q00635846 griffinn MIROS Changes
DWORD AnsweringApplication;
DWORD AnsweringCDN_High;
DWORD AnsweringCDN_Low;
DWORD AnsweringDNIS_High;
DWORD AnsweringDNIS_Low;
} NIMultiCastAgentRecord_Rls5; // size = 104 bytes
仅使用 IPAddress.NetworkToHostOrder(BitConverter.ToInt32(data, 0)); 即可解析所有其他 DWORDS 除了这些分裂的词。我个人认为数据似乎不正确,但我想要第二意见。
**最新开发..据我所知,代理 ID 是 30451。 如果您查看十六进制位,它就在十六进制中。
byte[] data = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x04, 0x51};
所以这就是我想出的。我觉得我在这里打破了各种规则......
string AgentID = BitConverter.ToString(data);
AgentID = AgentID.Replace("-", "").Replace("F", "");
【问题讨论】:
-
在网络顺序中,作为有符号的 32 位整数,
fff30451将是 -850863,而前面的四个ff值只是符号扩展64 位。这远不及 3 万(假设这就是 30XXX 的意思)。 -
另外,
i6.LeftInt32应该从ID_Low分配,低位从 [4] 到 [7]。 -
IPAddress具有采用 64 位值的方法重载。尝试 IPAddress.NetworkToHostOrder(BitConverter.ToInt64(data, 0))` 。一旦您的数据符合您的期望,就应该在没有显式布局结构的情况下处理它。 -
这里没有足够的信息来告诉您出了什么问题。但是,您提供的数据看起来不像 30000 到 30999 范围内的任何数字,甚至不是 0x30000 到 0x30fff 范围内的任何数字。即使我们取最小的字节并将其设为最重要的字节,这也会给我们一个大于 67,000,000 的数字。如果您可以说出这些字节应该代表什么确切,那么弄清楚它们是如何编码的将是微不足道的。没有这些信息,任何人都只能猜测。
-
添加了更多信息,希望对您有所帮助。我同意这些数据看起来根本不适合这些。我认为它不应该以 4x 0xFF 开头。自从我处理这种事情以来已经有一段时间了,所以我正在寻求其他意见。
标签: c# byte bitconverter