Проблемы с сетевым байтом [] до Int64 - PullRequest
0 голосов
/ 17 октября 2019

Я собираю двоичную информацию из многоадресного потока на ОЧЕНЬ старой системе. Я конвертировал большую часть, но у меня проблемы с комбо High / Low 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[] 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

Все остальные DWORDS разбираются нормальнотолько с IPAddress.NetworkToHostOrder (BitConverter.ToInt32 (data, 0));Кроме этих раздельных слов. Лично я думал, что данные не кажутся правильными, но я хотел получить второе мнение.

** Последние разработки. Идентификатор агента - 30451 из того, что мне говорят. если вы посмотрите на шестнадцатеричные биты, то это прямо в HEX.

byte[] data = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x04, 0x51};

Итак, вот что я придумала. Я чувствую, что нарушаю всевозможные правила здесь ...

string AgentID = BitConverter.ToString(data);
AgentID = AgentID.Replace("-", "").Replace("F", "");

1 Ответ

0 голосов
/ 17 октября 2019

Вы говорите, что это значение в диапазоне "30XXX" - поэтому 30,000 до 30,999.

Decimal    Hex big-endian    Hex little-endian
30000           0x75 0x30            0x30 0x75
30999           0x79 0x17            0x17 0x79

Так что в любом случае мы ищем как минимум один байт вдиапазон от 0x75 до 0x79, который будет существовать независимо от того, является ли оно 16-разрядным, 32-разрядным или 64-разрядным целым числом, а также независимо от того, является ли оно прямым или младшим порядковым числом.

Ни один из опубликованных вами байтов не находится в этом диапазоне - поэтому невозможно, чтобы любое из этих значений представляло значение в диапазоне от 30 000 до 30 999, используя обычные целые числа.

...