数据格式转换帮助类

自己在项目中总结了一些数据格式转换的方法,贴在这里备用,后续如果有其他的格式转换要求或方法,也贴在这里:

  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 = 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 = 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     }
时间: 2024-07-30 13:49:08

数据格式转换帮助类的相关文章

页面输入的数据格式转换类:BaseAction(常用于Struts框架中)

在我们接收页面传来的数据时,这些数据都是以String类型接收的,所以要进行数据格式转换,这时候就可以统一为它们进行转换,而且在处理这些数据的类中可以继承ActionSupport类,然后让每一个接收数据并做业务处理的action类继承该类,并调用该类中的数据格式转换方法对接收的数据进行处理. 部分关键代码如下: /** * 超类BaseAction 数据格式转换 * @author 七录斋 * */ public class BaseAction extends ActionSupport{

页面输入的数据格式转换类:BaseAction(经常使用于Struts框架中)

在我们接收页面传来的数据时,这些数据都是以String类型接收的,所以要进行数据格式转换,这时候就能够统一为它们进行转换,并且在处理这些数据的类中能够继承ActionSupport类,然后让每个接收数据并做业务处理的action类继承该类,并调用该类中的数据格式转换方法对接收的数据进行处理. 部分关键代码例如以下: /** * 超类BaseAction 数据格式转换 * @author 七录斋 * */ public class BaseAction extends ActionSupport{

数据格式转换 (三)Office文档转HTML

一.引言 Android中通过findViewById在布局文件中找到需要的View,加入一个Activity里面有许多的View需要初始化,那将是一件很繁琐的事情.当然Google一下你会发现有很多Android Annotations框架.比如比较有名的"Android Annotations",这样的框架很复杂,用起来也比较麻烦,还有一些BUG,第一次使用也花费了不少时间研究.也许你在项目中只希望用到 Inject View这个功能,又或者你想知道这个实现的原理是怎样的.本文主要

常用的Java字符转换工具类

该类里包含了Java中常用的字符串处理方法,如日期处理.金额转换... ----------------------------------------------------------------------------------------- import java.math.BigDecimal;import java.sql.Timestamp;import java.text.SimpleDateFormat;import java.util.Calendar;import jav

数据格式转换(一)PDF转换技术

PDF(Portable Document Format)文件格式是Adobe公司开发的电子文件格式.这种文件格式与操作系统平台无关,这一特点使它成为在Internet上进行电子文档发行和数字化信息传播的理想文档格式.越来越多的电子图书.产品说明.公司文告.网络资料.电子邮件开始使用PDF格式文件.PDF格式文件目前已成为数字化信息事实上的一个工业标准. PDF具有许多其他电子文档格式无法相比的优点.PDF文件格式可以将文字.字型.格式.颜色及独立于设备和分辨率的图形图像等封装在一个文件中.该格

zw版【转发&#183;台湾nvp系列Delphi例程】Delphi 使用 HALCON库件COM控件数据格式转换

zw版[转发·台湾nvp系列Delphi例程]Delphi 使用 HALCON库件COM控件数据格式转换 Delphi 使用 HALCON库件COM控件数据格式转换,与IHObjectX接口有关 var rg0,rg1 : HRegionX;begin rg0 := CoHRegionX.Create; rg0.GenRectangle1(10,10,150,150); rg1 := CoHRegionX.Create; rg1.GenRectangle1(200,200,250,250); r

Android Bitmap与DrawAble与byte[]与InputStream之间的转换工具类【转】

package com.soai.imdemo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.grap

数据格式转换(二)纯文本抽出

DMCTextFilter是由北京红樱枫软件有限公司研制和开发的纯文本抽出通用程序库产品.本产品可以从各种各样的文档格式的数据中或从插入的OLE对象中,完全除掉特殊控制信息,快速抽出纯文本数据信息.便于用户实现对多种文档数据资源信息进行统一管理,编辑,检索和浏览. 本产品采用了先进的多语言.多平台.多线程的设计理念,支持多国语言(英语,中文简体,中文繁体,日本语,韩国语),多种操作系统(Windows,Solaris,Linux,IBM AIX,Macintosh,HP-UNIX),多种文字集合

C++ Primer 学习笔记_64_重载操作符与转换 --转换与类类型【下】

重载操作符与转换 --转换与类类型[下] 四.重载确定和类的实参 在需要转换函数的实参时,编译器自动应用类的转换操作符或构造函数.因此,应该在函数确定期间考虑类转换操作符.函数重载确定由三步组成: 1)确定候选函数集合:这些是与被调用函数同名的函数. 2)选择可行的函数:这些是形参数目和类型与函数调用中的实参相匹配的候选函数.选择可行函数时,如果有转换操作,编译器还要确定需要哪个转换操作来匹配每个形参. 3)选择最佳匹配的函数.为了确定最佳匹配,对将实参转换为对应形参所需的类型转换进行分类.对于