首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SNMPSHARPNET为DateTime发送SNMPV2数据的正确方法是什么?

使用SNMPSHARPNET为DateTime发送SNMPV2数据的正确方法是什么?
EN

Stack Overflow用户
提问于 2015-03-16 15:30:57
回答 2查看 491关注 0票数 0

使用SNMPSHARPNET将UTC中的DateTime发送到SNMPV2事件的正确方法是什么?

http://www.snmpsharpnet.com/

我们一直在使用TimeTicks AsnType,但是在29天半的时间里遇到了一些数据问题。

这是供参考的代码:

代码语言:javascript
复制
    AsnType newMIBValue = null;
if (!string.IsNullOrEmpty(MIBValueString))
{
    switch (DataType)
    {
        case MIBDataType.DateAndTime:
            //newMIBValue = new TimeTicks(MIBValueString);
            newMIBValue = ConvertDateTimeToOctetString(MIBValueString);
            break;
        case MIBDataType.SnmpAdminString:
            newMIBValue = new OctetString(MIBValueString);
            break;
        case MIBDataType.TimeTicks:
            newMIBValue = new TimeTicks(MIBValueString);
            break;
        case MIBDataType.IPAddress:
            newMIBValue = new IpAddress(MIBValueString);
            break;
        case MIBDataType.Integer:
            newMIBValue = new Integer32(MIBValueString);
            break;
        default:
            break;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-23 17:01:55

我的一位同事帮我把这段代码。显然,我们已经按照SNMP规范发送了十六进制值的字节数组。

代码语言:javascript
复制
private OctetString ConvertStringToOctetString(DateTime dateTimeValueInUTCDateAndTime)
    {
        var yearInString = dateTimeValueInUTCDateAndTime.Year.ToString("X");            
        byte[] bytesArray = ConvertToByteArray(string.Format("{0}{1}{2}{3}{4}{5}{6}", 
            yearInString,
            dateTimeValueInUTCDateAndTime.Month.ToString("X").PadLeft(2, '0'),
            dateTimeValueInUTCDateAndTime.Day.ToString("X").PadLeft(2, '0'),
            dateTimeValueInUTCDateAndTime.Hour.ToString("X").PadLeft(2, '0'),
            dateTimeValueInUTCDateAndTime.Minute.ToString("X").PadLeft(2, '0'),
            dateTimeValueInUTCDateAndTime.Second.ToString("X").PadLeft(2, '0'),
            "00"
            ));         
        return new OctetString(bytesArray);
    }
    public byte[] ConvertToByteArray(string value)
    {
        byte[] bytes = null;
        if (String.IsNullOrEmpty(value))
            bytes = null;
        else
        {
            int string_length = value.Length;
            int character_index = (value.StartsWith("0x", StringComparison.Ordinal)) ? 2 : 0; // Does the string define leading HEX indicator '0x'. Adjust starting index accordingly.               
            int number_of_characters = string_length - character_index;

            bool add_leading_zero = false;
            if (0 != (number_of_characters % 2))
            {
                add_leading_zero = true;

                number_of_characters += 1;  // Leading '0' has been striped from the string presentation.
            }

            bytes = new byte[number_of_characters / 2]; // Initialize our byte array to hold the converted string.

            int write_index = 0;
            if (add_leading_zero)
            {
                bytes[write_index++] = FromCharacterToByte(value[character_index], character_index);
                character_index += 1;
            }

            for (int read_index = character_index; read_index < value.Length; read_index += 2)
            {
                byte upper = FromCharacterToByte(value[read_index], read_index, 4);
                byte lower = FromCharacterToByte(value[read_index + 1], read_index + 1);

                bytes[write_index++] = (byte)(upper | lower);
            }
        }

        return bytes;
    }
    private byte FromCharacterToByte(char character, int index, int shift = 0)
    {
        byte value = (byte)character;
        if (((0x40 < value) && (0x47 > value)) || ((0x60 < value) && (0x67 > value)))
        {
            if (0x40 == (0x40 & value))
            {
                if (0x20 == (0x20 & value))
                    value = (byte)(((value + 0xA) - 0x61) << shift);
                else
                    value = (byte)(((value + 0xA) - 0x41) << shift);
            }
        }
        else if ((0x29 < value) && (0x40 > value))
            value = (byte)((value - 0x30) << shift);
        else
            throw new InvalidOperationException(String.Format("Character '{0}' at index '{1}' is not valid alphanumeric character.", character, index));

        return value;
    }
票数 0
EN

Stack Overflow用户

发布于 2015-03-23 20:39:31

将八进制字符串用于日期时间内容。TimeTicks是一个非负整数,它指定两个事件之间的运行时间,单位为百分之一秒。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29080732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档