首页 > 代码库 > 数据格式转换帮助类
数据格式转换帮助类
自己在项目中总结了一些数据格式转换的方法,贴在这里备用,后续如果有其他的格式转换要求或方法,也贴在这里:
1 /// <summary> 2 /// 字节数组转换类,主要实现的均是代码中可能要用到的,未用到的暂时不提供。此类涉及电脑大小端的判断。 3 /// </summary> 4 public static class BitConvertHelper 5 { 6 public static string ConvertEndpointToIpStr(EndPoint endPoint) 7 { 8 var remote = endPoint as IPEndPoint; 9 if (remote != null) 10 { 11 return remote.Address.ToString(); 12 } 13 return null; 14 } 15 16 public static byte[] UInt16ToNetworkBytes(ushort data) 17 { 18 return BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)data)); 19 } 20 21 /// <summary> 22 /// 将当前的制板时间转换为字节数组,配置模式中有用 23 /// </summary> 24 /// <returns></returns> 25 public static byte[] ConvertDataTimeToBytes(DateTime? dataTime) 26 { 27 if (dataTime == null) 28 throw new ArgumentNullException("dataTime"); 29 30 int year = dataTime.Value.Year - 2000; 31 32 if (year < 0 || year > 125) 33 { 34 return new byte[3]; 35 } 36 37 return new byte[3] { (byte)year, (byte)dataTime.Value.Month, (byte)dataTime.Value.Day }; 38 } 39 40 public static DateTime ConvertBytesToDateTime(byte[] bytes, int start) 41 { 42 int year = bytes[start] + 2000; 43 int month = bytes[start + 1]; 44 int day = bytes[start + 2]; 45 return new DateTime(year, month, day); 46 } 47 /// <summary> 48 /// 将字符串形式的地址转成字节数组 49 /// </summary> 50 /// <param name="addr"></param> 51 /// <param name="seperator"></param> 52 /// <returns></returns> 53 public static byte[] ConvertAddrStrToBytes(string addr, char seperator) 54 { 55 if (addr == null) 56 throw new ArgumentNullException("addr"); 57 var items = addr.Split(seperator); 58 return items.Select(item => Convert.ToByte(item)).ToArray(); 59 } 60 61 /// <summary> 62 /// 63 /// </summary> 64 /// <param name="addr"></param> 65 /// <param name="seperator"></param> 66 /// <returns></returns> 67 public static string ConvertToString(IEnumerable<byte> addr, char seperator) 68 { 69 var sb = new StringBuilder(); 70 foreach (var a in addr) 71 { 72 sb.Append(a.ToString("X2")).Append(seperator); 73 } 74 var str = sb.ToString(); 75 return str.TrimEnd(seperator); 76 } 77 78 public static string ConvertBytesToStr(byte[] scr, int start, int end, char seperator) 79 { 80 var sb = new StringBuilder(); 81 for (int i = start; i < end; i++) 82 { 83 sb.Append(scr[i].ToString("X2")).Append(seperator); 84 } 85 var str = sb.ToString(); 86 return str.TrimEnd(seperator); 87 } 88 89 /// <summary> 90 /// Converts a hex string to a byte array. 91 /// </summary> 92 /// <param name="hex">The hex string</param> 93 /// <returns>Array of bytes</returns> 94 public static byte[] HexToBytes(string hex) 95 { 96 if (hex == null) 97 throw new ArgumentNullException("hex"); 98 99 if (hex.Length % 2 != 0)100 throw new FormatException("Hex character count is not even!");101 102 var bytes = new byte[hex.Length / 2];103 104 for (int i = 0; i < bytes.Length; i++)105 bytes[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);106 107 return bytes;108 }109 110 public static byte GetByte(byte[] dataBytes,int offset)111 {112 return dataBytes[offset];113 }114 115 public static byte[] GetBytes(byte[] dataBytes, int offset, int length)116 {117 var data = http://www.mamicode.com/new byte[length];118 Buffer.BlockCopy(dataBytes, offset, data, 0, length);119 return data;120 121 //return dataBytes.Slice(offset, length); //此方案效率较低122 }123 124 //public static ushort ConvertToUshort(byte[] dataBytes, int offset)125 //{126 // var bytes = TryReverseBytes(GetBytes(dataBytes,offset,2));127 // return BitConverter.ToUInt16(bytes, 0);128 //}129 130 public static ushort ConvertToUshort(byte[] dataBytes, int startIndex)131 {132 return (ushort)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(dataBytes, startIndex));133 }134 135 public static uint ConvertToUint(byte[] dataBytes, int offset)136 {137 var bytes = TryReverseBytes(GetBytes(dataBytes, offset, 4));138 return BitConverter.ToUInt32(bytes, 0);139 }140 141 /// <summary>142 /// 某些情况下有效位数可能不是4个字节,但需要转换为uint类型143 /// </summary>144 /// <param name="dataBytes"></param>145 /// <param name="offset"></param>146 /// <param name="length">要转换为uint的字节个数</param>147 /// <returns></returns>148 public static uint ConvertToUint(byte[] dataBytes, int offset, int length)149 {150 if (length > 4 || length <= 0)151 {152 throw new ArgumentOutOfRangeException("length");153 }154 var bytes = new byte[4];155 var bytesUsage = GetBytes(dataBytes, offset, length);156 Buffer.BlockCopy(bytesUsage, 0, bytes, 4 - length, length);157 bytes = TryReverseBytes(bytes);158 return BitConverter.ToUInt32(bytes, 0);159 }160 161 public static uint[] NetworkBytesToHostUint32(byte[] networkBytes)162 {163 if (networkBytes == null)164 throw new ArgumentNullException("networkBytes");165 166 if (networkBytes.Length%2 != 0)167 throw new FormatException("NetworkBytesNotEven");168 169 uint[] result = new uint[networkBytes.Length >> 2];170 171 for (int i = 0; i < result.Length; i++)172 result[i] = (uint) IPAddress.NetworkToHostOrder(BitConverter.ToInt32(networkBytes, i*4));173 174 return result;175 }176 177 /// <summary>178 /// 将数组中byte数据转换为uint.自己注意start和end的范围,179 /// </summary>180 /// <param name="networkBytes"></param>181 /// <param name="start">包含start,0开始</param>182 /// <param name="end">不包含end</param>183 /// <returns></returns>184 public static uint[] NetworkBytesToHostUint32(byte[] networkBytes, int start, int end)185 {186 if (networkBytes == null)187 throw new ArgumentNullException("networkBytes");188 189 var length = end - start;190 191 if (length % 2 != 0)192 throw new FormatException("NetworkBytesNotEven");193 194 var result = new uint[length >> 2];195 196 for (int i = 0; i < result.Length; i++)197 result[i] = (uint) IPAddress.NetworkToHostOrder(BitConverter.ToInt32(networkBytes, start + i << 2));198 199 return result;200 }201 202 /// <summary>203 /// 直接将数据写入传入的数组,不再重新申请空间,todo:此函数不是通用函数,是为了数据采集部分方便而编写204 /// </summary>205 /// <param name="srcNetworkBytes"></param>206 /// <param name="srcStart"></param>207 /// <param name="srcEnd"></param>208 /// <param name="dstUints"></param>209 /// <param name="dstStarti"></param>210 /// <param name="dstStartj"></param>211 public static void NetworkBytesToUint32Array(byte[] srcNetworkBytes, int srcStart, int srcEnd, uint[,] dstUints,212 int dstStarti,int dstStartj)213 {214 if (srcNetworkBytes == null)215 throw new ArgumentNullException("srcNetworkBytes");216 if (dstUints == null)217 throw new ArgumentNullException("dstUints");218 219 var length = srcEnd - srcStart;220 221 if (length % 2 != 0)222 throw new FormatException("NetworkBytesNotEven");223 224 for (int i = 0; i < length >> 2; i++)225 dstUints[dstStarti,dstStartj + i] =226 (uint) IPAddress.NetworkToHostOrder(BitConverter.ToInt32(srcNetworkBytes, srcStart + (i << 2)));227 }228 229 230 public static int ConvertToInt(byte[] dataBytes, int offset)231 {232 var bytes = TryReverseBytes(GetBytes(dataBytes, offset, 4));233 return BitConverter.ToInt32(bytes, 0);234 }235 236 //public static int ConvertToInt(byte[] dataBytes, int offset, int length)237 //{238 // if (length > 4 || length <= 0)239 // {240 // throw new ArgumentOutOfRangeException("length");241 // }242 // var bytes = new byte[4];243 // var bytesUsage = GetBytes(dataBytes, offset, length);244 // Buffer.BlockCopy(bytesUsage, 0, bytes, 4 - length, length);245 // bytes = TryReverseBytes(bytes);246 // return BitConverter.ToInt32(bytes, 0);247 //}248 249 public static int ConvertToInt(byte[] dataBytes, int startIndex, int length)250 {251 if (length > 4 || length <= 0)252 {253 throw new ArgumentOutOfRangeException("length");254 }255 var bytes = new byte[4];256 Buffer.BlockCopy(GetBytes(dataBytes, startIndex, length), 0, bytes, 4 - length, length);257 return IPAddress.NetworkToHostOrder(BitConverter.ToInt32(bytes, 0));258 }259 260 public static void BigEndianBlockCopy(uint[,] src, int srcOffset, byte[] dst, int dstOffset, int byteCounts)261 {262 //获取要拷贝的uint的个数263 int uintCount = byteCounts/sizeof (uint);264 int uintSrcOffset = srcOffset/sizeof (uint);265 int endSrcOffset = uintCount + uintSrcOffset;266 var uintBytes = new byte[sizeof(uint)];267 int uintIndex = 0;268 int byteIndex = 0;269 270 foreach (var u in src)271 {272 if (uintIndex >= uintSrcOffset)273 {274 CopyBytes(u, 4, uintBytes, 0);275 Buffer.BlockCopy(uintBytes, 0, dst, dstOffset + byteIndex, 4);276 byteIndex += 4;277 }278 uintIndex++;279 if (uintIndex >= endSrcOffset)280 {281 break;282 }283 }284 }285 286 public static void CopyBytes(uint value, int bytes, byte[] buffer, int index)287 {288 int endOffset = index + bytes - 1;289 for (int i = 0; i < bytes; i++)290 {291 buffer[endOffset - i] = unchecked((byte) (value & 0xff));292 value = http://www.mamicode.com/value >> 8;293 }294 }295 296 297 public static bool IsLittleEndian()298 {299 return BitConverter.IsLittleEndian;300 }301 302 /// <summary>303 /// Attention:将自己翻转304 /// </summary>305 /// <param name="bytes"></param>306 /// <returns></returns>307 private static byte[] TryReverseBytes(byte[] bytes)308 {309 if (IsLittleEndian())310 {311 bytes = ReverseBytes(bytes);312 }313 return bytes;314 }315 316 /// <summary>317 /// 翻转字节数组,数据以大端形式传输,不同的电脑直接顺序不同,可能是小端,因此需要翻转字节数组318 /// </summary>319 /// <param name="inArray"></param>320 /// <returns></returns>321 public static byte[] ReverseBytes(byte[] inArray)322 {323 byte temp;324 int highCtr = inArray.Length - 1;325 326 for (int ctr = 0; ctr < inArray.Length/2; ctr++)327 {328 temp = inArray[ctr];329 inArray[ctr] = inArray[highCtr];330 inArray[highCtr] = temp;331 highCtr -= 1;332 }333 return inArray;334 }335 336 public static IEnumerable<T> Slice<T>(this IEnumerable<T> source, int startIndex, int size)337 {338 if (source == null)339 throw new ArgumentNullException("source");340 var enumerable = source as T[] ?? source.ToArray();341 int num = enumerable.Count();342 if (startIndex < 0 || num < startIndex)343 throw new ArgumentOutOfRangeException("startIndex");344 if (size < 0 || startIndex + size > num)345 throw new ArgumentOutOfRangeException("size");346 347 return enumerable.Skip(startIndex).Take(size);348 }349 350 public static T[] Slice<T>(this T[] source, int startIndex, int size)351 {352 if (source == null)353 throw new ArgumentNullException("source");354 int num = source.Count();355 if (startIndex < 0 || num < startIndex)356 throw new ArgumentOutOfRangeException("startIndex");357 if (size < 0 || startIndex + size > num)358 throw new ArgumentOutOfRangeException("size");359 360 return source.Skip(startIndex).Take(size).ToArray();361 }362 }
数据格式转换帮助类
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。