using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Serialization.Formatters.Binary; using System.Text; namespace JWH { public static class ExtensionByte { #region [ Byte ] ------------------------------------------------------ /// /// 바이트 배열을 복제합니다 /// /// /// /// /// public static byte[] Clone(this byte[] sender, int offset = -1, int length = -1) { try { if (offset < 0) offset = 0; if (length < 0) length = sender.Length - offset; if (length > sender.Length - offset) length = sender.Length - offset; byte[] value = new byte[length]; Buffer.BlockCopy(sender, offset, value, 0, length); return value; } catch (Exception ex) { XLogger.Instance.Fatal(ex); throw ex; } } #endregion #region [ String ] ---------------------------------------------------- /// /// 문자열을 바이트 배열로 반환한다 /// /// /// public static byte[] ConvertBytes(this string sender) { try { return Encoding.Default.GetBytes(sender); } catch (Exception ex) { XLogger.Instance.Fatal(ex); throw ex; } } /// /// 진수형태의 문자열을 바이트 배열로 반환한다 /// /// /// 문자열 값의 기수로서 2, 8, 10 또는 16이어야 합니다. /// public static byte[] ConvertBytes(this string sender, int fromBase) { try { char[] arrContains = "0123456789ABCDEF".Substring(0, fromBase).ToCharArray(); // 기수에서 허용하지 않는 문자를 필터링 StringBuilder sb = new StringBuilder(); string value = sender.ToUpper(); foreach (char ch in value.ToCharArray()) { if (arrContains.Contains(ch) == false) continue; sb.Append(ch); } value = sb.ToString(); List bytes = new List(); int step = fromBase > 10 ? 2 : 1; if (fromBase == 2) step = 8; for (int i = 0; i < value.Length; i += step) { if (i + step > value.Length) break; byte byteValue = Convert.ToByte(value.Substring(i, step), fromBase); bytes.Add(byteValue); } return bytes.ToArray(); } catch (Exception ex) { XLogger.Instance.Fatal(ex); throw ex; } } /// /// 바이트 배열을 문자열로 변환합니다 /// /// /// public static string ConvertString(this byte[] sender, int index = 0, int length = -1) { try { if (sender == null) return string.Empty; if (length < 0) length = sender.Length; return Encoding.Default.GetString(sender, index, length); } catch (Exception ex) { XLogger.Instance.Fatal(ex); throw ex; } } /// /// 바이트 배열을 HEX 문자열로 반환한다 /// /// /// public static string ConvertHexString(this byte[] sender, int lineFeed = -1) { try { if (sender == null) return string.Empty; StringBuilder sb = new StringBuilder(); int index = 0; int length = (lineFeed <= 0 ? int.MaxValue : lineFeed); while (true) { if (index + length > sender.Length) length = sender.Length - index; if (length == 0) break; sb.AppendLine(BitConverter.ToString(sender, index, length).Replace("-", " ")); index += length; } return sb.ToString(); } catch (Exception ex) { XLogger.Instance.Fatal(ex); throw ex; } } /// /// HEX 문자열을 Byte[]로 변환한다 /// /// /// public static byte[] ToByteFromHexString(this string sender) { try { int mod = sender.Length % 2; if (mod != 0) return null; byte[] array = new byte[sender.Length / 2]; for (int i = 0; i < array.Length; i++) array[i] = Convert.ToByte(sender.Substring(i * 2, 2), 16); return array; } catch (Exception ex) { XLogger.Instance.Fatal(ex); return null; } } #endregion #region [ Int ] ------------------------------------------------------- /// /// int 값을 바이트 배열로 반환한다 /// /// /// Byte Length /// public static byte[] ConvertByte(this int sender, int length = 0) { try { byte[] intByte = BitConverter.GetBytes(sender); if (length < 1) length = intByte.Length; byte[] convByte = new byte[length]; Array.Copy(intByte, convByte, length); if (BitConverter.IsLittleEndian) Array.Reverse(convByte); return convByte; } catch (Exception ex) { XLogger.Instance.Fatal(ex); throw ex; } } /// /// 바이트 배열값을 Int로 변환한다 /// /// /// /// /// public static int ConvertInt(this byte[] sender, int startIndex = 0, int length = -1) { try { if (sender == null) return 0; if (length == -1) length = sender.Length; byte[] byteBuff = new byte[length]; for (int i = 0; i < length; i++) byteBuff[i] = sender[startIndex + i]; if (BitConverter.IsLittleEndian) Array.Reverse(byteBuff); int value = 0; for (int i = 0; i < length; i++) value |= byteBuff[i] << (i * 8); return value; } catch (Exception ex) { XLogger.Instance.Fatal(ex); return 0; throw ex; } } /// /// 2바이트 배열 값을 short(Int16) 값으로 반환한다 /// /// /// /// /// public static short ConvertInt16(this byte[] sender, int index = 0, int length = -1) { try { int destIndex = 0; byte[] byteBuff = new byte[2]; if (sender == null) return 0; if (length < 1) length = sender.Length; if (length > byteBuff.Length) length = byteBuff.Length; destIndex = byteBuff.Length - length; Array.Copy(sender, index, byteBuff, destIndex, length); if (BitConverter.IsLittleEndian) Array.Reverse(byteBuff); return BitConverter.ToInt16(byteBuff, 0); } catch (Exception ex) { XLogger.Instance.Fatal(ex); throw ex; } } /// /// 4바이트 배열 값을 int(Int32) 값으로 반환한다 /// /// /// /// /// public static int ConvertInt32(this byte[] sender, int index = 0, int length = -1) { try { int destIndex = 0; byte[] byteBuff = new byte[4]; if (sender == null) return 0; if (length < 1) length = sender.Length; if (length > byteBuff.Length) length = byteBuff.Length; destIndex = byteBuff.Length - length; Array.Copy(sender, index, byteBuff, destIndex, length); if (BitConverter.IsLittleEndian) Array.Reverse(byteBuff); return BitConverter.ToInt32(byteBuff, 0); } catch (Exception ex) { XLogger.Instance.Fatal(ex); throw ex; } } /// /// 8바이트 배열 값을 long(Int64) 값으로 반환한다 /// /// /// /// /// public static long ConvertInt64(this byte[] sender, int index = 0, int length = -1) { try { int destIndex = 0; byte[] byteBuff = new byte[8]; if (sender == null) return 0; if (length < 1) length = sender.Length; if (length > byteBuff.Length) length = byteBuff.Length; destIndex = byteBuff.Length - length; Array.Copy(sender, index, byteBuff, destIndex, length); if (BitConverter.IsLittleEndian) Array.Reverse(byteBuff); return BitConverter.ToInt64(byteBuff, 0); } catch (Exception ex) { XLogger.Instance.Fatal(ex); throw ex; } } /// /// 2바이트 배열 값을 ushort(UInt16) 값으로 반환한다 /// /// /// /// /// public static ushort ConvertUInt16(this byte[] sender, int index = 0, int length = -1) { try { int destIndex = 0; byte[] byteBuff = new byte[2]; if (sender == null) return 0; if (length < 1) length = sender.Length; if (length > byteBuff.Length) length = byteBuff.Length; destIndex = byteBuff.Length - length; Array.Copy(sender, index, byteBuff, destIndex, length); if (BitConverter.IsLittleEndian) Array.Reverse(byteBuff); return BitConverter.ToUInt16(byteBuff, 0); } catch (Exception ex) { XLogger.Instance.Fatal(ex); throw ex; } } /// /// 4바이트 배열 값을 ulong(UInt32) 값으로 반환한다 /// /// /// /// /// public static ulong ConvertUInt32(this byte[] sender, int index = 0, int length = -1) { try { int destIndex = 0; byte[] byteBuff = new byte[4]; if (sender == null) return 0; if (length < 1) length = sender.Length; if (length > byteBuff.Length) length = byteBuff.Length; destIndex = byteBuff.Length - length; Array.Copy(sender, index, byteBuff, destIndex, length); if (BitConverter.IsLittleEndian) Array.Reverse(byteBuff); return BitConverter.ToUInt32(byteBuff, 0); } catch (Exception ex) { XLogger.Instance.Fatal(ex); throw ex; } } /// /// 8바이트 배열 값을 ulong(UInt64) 값으로 반환한다 /// /// /// /// /// public static ulong ConvertUInt64(this byte[] sender, int index = 0, int length = -1) { try { int destIndex = 0; byte[] byteBuff = new byte[8]; if (sender == null) return 0; if (length < 1) length = sender.Length; if (length > byteBuff.Length) length = byteBuff.Length; destIndex = byteBuff.Length - length; Array.Copy(sender, index, byteBuff, destIndex, length); if (BitConverter.IsLittleEndian) Array.Reverse(byteBuff); return BitConverter.ToUInt64(byteBuff, 0); } catch (Exception ex) { XLogger.Instance.Fatal(ex); throw ex; } } /// /// 4바이트 배열 값을 float(Single 단정밀도 부동 소수점) 값으로 반환한다 /// /// /// /// /// public static float ConvertSingle(this byte[] sender, int index = 0, int length = -1) { try { int destIndex = 0; byte[] byteBuff = new byte[4]; if (sender == null) return 0; if (length < 1) length = sender.Length; if (length > byteBuff.Length) length = byteBuff.Length; destIndex = byteBuff.Length - length; Array.Copy(sender, index, byteBuff, destIndex, length); if (BitConverter.IsLittleEndian) Array.Reverse(byteBuff); return BitConverter.ToSingle(byteBuff, 0); } catch (Exception ex) { XLogger.Instance.Fatal(ex); throw ex; } } /// /// 8바이트 배열 값을 double(배정밀도 부동 소수점) 값으로 반환한다 /// /// /// /// /// public static double ConvertDouble(this byte[] sender, int index = 0, int length = -1) { try { int destIndex = 0; byte[] byteBuff = new byte[8]; if (sender == null) return 0; if (length < 1) length = sender.Length; if (length > byteBuff.Length) length = byteBuff.Length; destIndex = byteBuff.Length - length; Array.Copy(sender, index, byteBuff, destIndex, length); if (BitConverter.IsLittleEndian) Array.Reverse(byteBuff); return BitConverter.ToDouble(byteBuff, 0); } catch (Exception ex) { XLogger.Instance.Fatal(ex); throw ex; } } #endregion /// /// ToObject /// /// /// /// public static T ToObject(this byte[] array) where T : class, new() { try { T obj = new T(); using (MemoryStream stream = new MemoryStream(array)) { BinaryFormatter formatter = new BinaryFormatter(); stream.Position = 0; obj = (T)formatter.Deserialize(stream); return obj; } } catch (Exception ex) { XLogger.Instance.Fatal(ex); return null; } } } }