コード例 #1
0
        public static void InterfaceDescriptionOption_ConvertToByte_Test(bool reorder)
        {
            InterfaceDescriptionOption preOption = new InterfaceDescriptionOption();
            InterfaceDescriptionOption postOption;

            preOption.Comment            = "Test Comment";
            preOption.Description        = "Test Description";
            preOption.EuiAddress         = new byte[] { 0x00, 0x0A, 0xE6, 0xFF, 0xFE, 0x3E, 0xFD, 0xE1 };
            preOption.Filter             = new byte[] { 5, 6, 7, 8 };
            preOption.FrameCheckSequence = 255;
            preOption.IPv4Address        = new IPAddress_v4(new byte[] { 127, 0, 0, 1, 255, 255, 255, 0 });
            preOption.IPv6Address        = new IPAddress_v6(new byte[] { 0x20, 0x01, 0x0d, 0x0db, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x28, 0x57, 0xab, 0x40 });
            preOption.MacAddress         = new PhysicalAddress(new byte[] { 0x00, 0x0A, 0xE6, 0x3E, 0xFD, 0xE1 });
            preOption.Name                = "Test Name";
            preOption.OperatingSystem     = "Test OperatingSystem";
            preOption.Speed               = 12345678;
            preOption.TimeOffsetSeconds   = 1234;
            preOption.TimestampResolution = 6;
            preOption.TimeZone            = 1;

            byte[] preOptionByte = preOption.ConvertToByte(reorder, null);
            using (MemoryStream stream = new MemoryStream(preOptionByte))
            {
                using (BinaryReader binaryReader = new BinaryReader(stream))
                {
                    postOption = InterfaceDescriptionOption.Parse(binaryReader, reorder, null);
                }
            }

            Assert.IsNotNull(postOption);
            Assert.AreEqual(preOption.Comment, postOption.Comment);
            Assert.AreEqual(preOption.Description, postOption.Description);
            Assert.AreEqual(preOption.EuiAddress, postOption.EuiAddress);
            Assert.AreEqual(preOption.Filter, postOption.Filter);
            Assert.AreEqual(preOption.FrameCheckSequence, postOption.FrameCheckSequence);
            Assert.AreEqual(preOption.IPv4Address, postOption.IPv4Address);
            Assert.AreEqual(preOption.IPv6Address, postOption.IPv6Address);
            Assert.AreEqual(preOption.MacAddress, postOption.MacAddress);
            Assert.AreEqual(preOption.Name, postOption.Name);
            Assert.AreEqual(preOption.OperatingSystem, postOption.OperatingSystem);
            Assert.AreEqual(preOption.Speed, postOption.Speed);
            Assert.AreEqual(preOption.TimeOffsetSeconds, postOption.TimeOffsetSeconds);
            Assert.AreEqual(preOption.TimestampResolution, postOption.TimestampResolution);
            Assert.AreEqual(preOption.TimeZone, postOption.TimeZone);
        }
コード例 #2
0
        public static InterfaceDescriptionOption Parse(BinaryReader binaryReader, bool reverseByteOrder, Action <Exception> ActionOnException)
        {
            CustomContract.Requires <ArgumentNullException>(binaryReader != null, "binaryReader cannot be null");
            InterfaceDescriptionOption            option      = new InterfaceDescriptionOption();
            List <KeyValuePair <ushort, byte[]> > optionsList = EkstractOptions(binaryReader, reverseByteOrder, ActionOnException);

            if (optionsList.Any())
            {
                foreach (var item in optionsList)
                {
                    try
                    {
                        switch (item.Key)
                        {
                        case (ushort)InterfaceDescriptionOptionCode.CommentCode:
                            option.Comment = UTF8Encoding.UTF8.GetString(item.Value);
                            break;

                        case (ushort)InterfaceDescriptionOptionCode.NameCode:
                            option.Name = UTF8Encoding.UTF8.GetString(item.Value);
                            break;

                        case (ushort)InterfaceDescriptionOptionCode.DescriptionCode:
                            option.Description = UTF8Encoding.UTF8.GetString(item.Value);
                            break;

                        case (ushort)InterfaceDescriptionOptionCode.IPv4AddressCode:
                            if (item.Value.Length == 8)
                            {
                                option.IPv4Address = new IPAddress_v4(item.Value);
                            }
                            else
                            {
                                throw new ArgumentException(string.Format("[InterfaceDescriptio.Parse] IPv4AddressCode contains invalid length. Received: {0} bytes, expected: {1}", item.Value.Length, 8));
                            }
                            break;

                        case (ushort)InterfaceDescriptionOptionCode.IPv6AddressCode:
                            if (item.Value.Length == 17)
                            {
                                option.IPv6Address = new IPAddress_v6(item.Value);
                            }
                            else
                            {
                                throw new ArgumentException(string.Format("[InterfaceDescriptio.Parse] IPv6AddressCode contains invalid length. Received: {0} bytes, expected: {1}", item.Value.Length, 17));
                            }
                            break;

                        case (ushort)InterfaceDescriptionOptionCode.MacAddressCode:
                            if (item.Value.Length == 6)
                            {
                                option.MacAddress = new PhysicalAddress(item.Value);
                            }
                            else
                            {
                                throw new ArgumentException(string.Format("[InterfaceDescriptio.Parse] MacAddressCode contains invalid length. Received: {0} bytes, expected: {1}", item.Value.Length, 6));
                            }
                            break;

                        case (ushort)InterfaceDescriptionOptionCode.EuiAddressCode:
                            if (item.Value.Length == 8)
                            {
                                option.EuiAddress = item.Value;
                            }
                            else
                            {
                                throw new ArgumentException(string.Format("[InterfaceDescriptio.Parse] EuiAddressCode contains invalid length. Received: {0} bytes, expected: {1}", item.Value.Length, 8));
                            }
                            break;

                        case (ushort)InterfaceDescriptionOptionCode.SpeedCode:
                            if (item.Value.Length == 8)
                            {
                                option.Speed = (BitConverter.ToInt64(item.Value, 0)).ReverseByteOrder(reverseByteOrder);
                            }
                            else
                            {
                                throw new ArgumentException(string.Format("[InterfaceDescriptio.Parse] SpeedCode contains invalid length. Received: {0} bytes, expected: {1}", item.Value.Length, 8));
                            }
                            break;

                        case (ushort)InterfaceDescriptionOptionCode.TimestampResolutionCode:
                            if (item.Value.Length == 1)
                            {
                                option.TimestampResolution = item.Value[0];
                            }
                            else
                            {
                                throw new ArgumentException(string.Format("[InterfaceDescriptio.Parse] TimestampResolutionCode contains invalid length. Received: {0} bytes, expected: {1}", item.Value.Length, 1));
                            }
                            break;

                        case (ushort)InterfaceDescriptionOptionCode.TimeZoneCode:
                            if (item.Value.Length == 4)
                            {
                                option.TimeZone = (BitConverter.ToInt32(item.Value, 0)).ReverseByteOrder(reverseByteOrder);     // GMT offset
                            }
                            else
                            {
                                throw new ArgumentException(string.Format("[InterfaceDescriptio.Parse] TimeZoneCode contains invalid length. Received: {0} bytes, expected: {1}", item.Value.Length, 4));
                            }
                            break;

                        case (ushort)InterfaceDescriptionOptionCode.FilterCode:
                            option.Filter = item.Value;
                            break;

                        case (ushort)InterfaceDescriptionOptionCode.OperatingSystemCode:
                            option.OperatingSystem = UTF8Encoding.UTF8.GetString(item.Value);
                            break;

                        case (ushort)InterfaceDescriptionOptionCode.FrameCheckSequenceCode:
                            if (item.Value.Length == 1)
                            {
                                option.FrameCheckSequence = item.Value[0];
                            }
                            else
                            {
                                throw new ArgumentException(string.Format("[InterfaceDescriptio.Parse] FrameCheckSequenceCode contains invalid length. Received: {0} bytes, expected: {1}", item.Value.Length, 1));
                            }
                            break;

                        case (ushort)InterfaceDescriptionOptionCode.TimeOffsetSecondsCode:
                            if (item.Value.Length == 8)
                            {
                                option.TimeOffsetSeconds = (BitConverter.ToInt64(item.Value, 0)).ReverseByteOrder(reverseByteOrder);
                            }
                            else
                            {
                                throw new ArgumentException(string.Format("[InterfaceDescriptio.Parse] TimeOffsetSecondsCode contains invalid length. Received: {0} bytes, expected: {1}", item.Value.Length, 8));
                            }
                            break;

                        case (ushort)InterfaceDescriptionOptionCode.EndOfOptionsCode:
                        default:
                            break;
                        }
                    }
                    catch (Exception exc)
                    {
                        if (ActionOnException != null)
                        {
                            ActionOnException(exc);
                        }
                    }
                }
            }
            return(option);
        }