各位看官好久不见,又是很久没有更新博客了,看了一下博客里上一篇文章也是两个多礼拜之前的事情了。其实最近小柊我又开始进入倦怠期了,一直拿不出什么干劲。
第一次在C#中,将一个IPAddress对象保存为byte[]数组这个问题出现在10月份,那时候从老师手里接过一个项目,由我负责网站主体的开发,由另外一位同学负责数据库的搭建。
等到那个同学跟我说数据库搭好了,我准备进行网站建设的时候,突然发现他搭的数据库简直没法用。数据库的表名、字段名全是拼音,这也罢了,居然还有两个地方还按错了;数据库存放字符串的字段,有的用的是nchar,有的用的是nvchar,有些地方的字符串长度还设置的特别小,经常导致Entity Framework抛出“对一个对象或多个实体验证失败”的异常。最后一个让我深表蛋疼的问题就是他不知从哪里查来,在大公司里,在数据库里存放IP地址是使用varbinary储存的。这个varbinary在EF框架Model First里是直接被视为一个byte[]数组。这个项目主要就也只是一个演示用,功能能用就行,但这个项目非常的急,所以当时希望一切从简的我认为存放IP字段只要用nvchar存放就行了,现在最重要的是程序实现。但最后因为种种考虑,直接在数据库里修改字段类型是没法子了,也只有硬上了。
1.我的解决方案
我的解决方案里,还是比较蠢的将IPAddress转化为字符串,然后再用Split方法切割后进行每个单元的byte转化。这种方法非常局限,反正我估计是没办法处理存放着IP v6的IPAddress对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#region 将IPAddress转化为byte[] + public static byte[] IPAddressToByteArray(IPAddress ipa) /// <summary> /// 将IPAddress转化为byte[] /// </summary> /// <param name="ipa">待转化的IPAddress</param> /// <returns>转换后的byte[]</returns> public static byte[] IPAddressToByteArray(IPAddress ipa) { string ip = ipa.ToString(); string[] ips = ip.Split('.'); List<byte> list = new List<byte>(); foreach (string unit in ips) { list.Add(Convert.ToByte(unit)); } return list.ToArray(); } #endregion #region 将byte[]转化为IPAddress + public static string ByteArrayToIPAddress(byte[] bytes) /// <summary> /// 将byte[]转化为IPAddress /// </summary> /// <param name="bytes">待转化的byte[]</param> /// <returns>转换后的IPAddress</returns> public static string ByteArrayToIPAddress(byte[] bytes) { try { IPAddress ipa = new IPAddress(bytes); return ipa.ToString(); } catch { return ""; } } #endregion |
2.更优的解决方案
就在刚刚!我突然发现其实IPAddress类有一个GetAddressBytes方法!这个方法完美解决IPAddress类型转byte[]数组的问题(只怪自己当时太蠢)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#region 将IPAddress转化为byte[] + public static byte[] IPAddressToByteArray(IPAddress ipa) /// <summary> /// 将IPAddress转化为byte[] /// </summary> /// <param name="ipa">待转化的IPAddress</param> /// <returns>转换后的byte[]</returns> public static byte[] IPAddressToByteArray(IPAddress ipa) { if (ipa == null) return null; else return ipa.GetAddressBytes(); } #endregion #region 将byte[]转化为IPAddress + public static string ByteArrayToIPAddress(byte[] bytes) /// <summary> /// 将byte[]转化为IPAddress /// </summary> /// <param name="bytes">待转化的byte[]</param> /// <returns>转换后的IPAddress</returns> public static string ByteArrayToIPAddress(byte[] bytes) { try { IPAddress ipa = new IPAddress(bytes); return ipa.ToString(); } catch { return null; } } #endregion |
以上就是本文的所有内容,恳请各位看官批评指正!
小柊
2015年11月17日 23:04:32