c# - PhysicalAddress.Parse()不会解析小写的字符串,这是一个错误吗?

标签 c# .net parsing

注意:使用.Net 4.0

考虑下面的代码。

String ad = "FE23658978541236";
String ad2 = "00FABE002563447E".ToLower();
try
{
    PhysicalAddress.Parse(ad);
}
catch (Exception)
{
    //We dont get here, all went well
}
try
{
    PhysicalAddress.Parse(ad2);
}
catch (Exception)
{
    //we arrive here for what reason?
}
try
{
    //Ok, I do it myself then.
    ulong dad2 = ulong.Parse(ad2, System.Globalization.NumberStyles.HexNumber);
    byte[] bad2 = BitConverter.GetBytes(dad2);
    if (BitConverter.IsLittleEndian)
    {
        bad2 = bad2.Reverse().ToArray<byte>();
    }
    PhysicalAddress pa = new PhysicalAddress(bad2);
}
catch (Exception ex)
{
    //We don't get here as all went well
}


因此,尝试解析小写地址时,PhysicalAddress.Parse方法中引发了异常。当我查看.Net的源代码时,对我来说完全清楚为什么。
这是因为下面的代码。

    if (value >= 0x30 && value <=0x39){ 
        value -= 0x30;
    } 
    else if (value >= 0x41 && value <= 0x46) {
        value -= 0x37;
    }


Parse方法中可以找到。

    public static PhysicalAddress Parse(string address) {
    int validCount = 0; 
    bool hasDashes = false; 
    byte[] buffer = null;

    if(address == null)
    {
        return PhysicalAddress.None;
    } 

    //has dashes? 
    if (address.IndexOf('-') >= 0 ){ 
        hasDashes = true;
        buffer = new byte[(address.Length+1)/3];    
    }
    else{

        if(address.Length % 2 > 0){  //should be even 
            throw new FormatException(SR.GetString(SR.net_bad_mac_address));
        } 

        buffer = new byte[address.Length/2];
    } 

    int j = 0;
    for (int i = 0; i < address.Length; i++ ) {

        int value = (int)address[i];

        if (value >= 0x30 && value <=0x39){ 
            value -= 0x30;
        } 
        else if (value >= 0x41 && value <= 0x46) {
            value -= 0x37;
        }
        else if (value == (int)'-'){ 
            if (validCount == 2) {
                validCount = 0; 
                continue; 
            }
            else{ 
                throw new FormatException(SR.GetString(SR.net_bad_mac_address));
            }
        }
        else{ 
            throw new FormatException(SR.GetString(SR.net_bad_mac_address));
        } 

        //we had too many characters after the last dash
        if(hasDashes && validCount >= 2){ 
            throw new FormatException(SR.GetString(SR.net_bad_mac_address));
        }

        if (validCount%2 == 0) { 
            buffer[j] = (byte) (value << 4);
        } 
        else{ 
            buffer[j++] |= (byte) value;
        } 

        validCount++;
    }

    //we too few characters after the last dash
    if(validCount < 2){ 
        throw new FormatException(SR.GetString(SR.net_bad_mac_address)); 
    }

    return new PhysicalAddress(buffer);
}


可以将其视为错误吗?还是在字符串中使用小写的十六进制值是否非常错误?还是有一些我不知道的约定。
我个人认为该程序员不友好。

最佳答案

MSDN


  地址参数必须包含只能由以下内容组成的字符串
  数字和大写字母(十六进制数字)。一些例子
  可接受的字符串格式如下..请注意,包含f0-e1-d2-c3-b4-a5的地址将无法解析并引发异常。


因此,您可以简单地执行以下操作:PhysicalAddress.Parse(ad.ToUpper());

关于c# - PhysicalAddress.Parse()不会解析小写的字符串,这是一个错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18506334/

相关文章:

c# - 在代码中构建分析支持

java - 如何解析java源代码而不存储空行?

c# - Windows窗体应用程序中的记录错误

javascript - UnobtrusiveJavaScriptEnabled 键在 .NET 中有什么作用?

c# - 此工具集不支持 TargetFrameworkVersion 'v4.5.1' (ToolsVersion : 4. 0)

c# - .Net CodeDom - 在 .net 中实现 lambda 表达式

javascript - Angular 正在存储来自 JSON 响应的数据,并保留双引号 (%22)

python - 为什么标记数据时出现错误。 C错误: out of memory in my panda script

c# - WPF:DependencyProperty 适用于 TextBlock 但不适用于自定义控件

c# - 使用for循环读取完整的文本文件