/// <summary>
/// 本类提供了对byte数据的常用操作函数
/// </summary>
public class ByteUtil
{
private static char[] HEX_CHARS = {'','','','','','','','','','','A','B','C','D','E','F'};
private static byte[] BITS = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; /// <summary>
/// 将字节数组转换为HEX形式的字符串, 使用指定的间隔符
/// </summary>
public static string ByteToHex(byte[] buf, string separator)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
for(int i = ;i < buf.Length;i++)
{
if (i > )
{
sb.Append(separator);
}
sb.Append(HEX_CHARS[buf[i] >> ]).Append(HEX_CHARS[buf[i] & 0x0F]);
}
return sb.ToString();
} /// <summary>
/// 将字节数组转换为HEX形式的字符串, 使用指定的间隔符
/// </summary>
public static string ByteToHex(byte[] buf, char c)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
for(int i = ;i < buf.Length;i++)
{
if (i > )
{
sb.Append(c);
}
sb.Append(HEX_CHARS[buf[i] >> ]).Append(HEX_CHARS[buf[i] & 0x0F]);
}
return sb.ToString();
} /// <summary>
/// 判断字节数组前几位是否符合一定规则
/// </summary>
/// <param name="data">需要判断的字节数组</param>
/// <param name="pattern">匹配规则</param>
/// <returns>如果匹配返回true</returns>
public static bool IsMatch(byte[] data, params byte[] pattern)
{
if (data == null || data.Length < pattern.Length)
return false; for(int i = ;i < pattern.Length;i++)
{
if (data[i] != pattern[i])
return false;
}
return true;
} /// <summary>
/// 判断指定字节是否为列举的某个值
/// </summary>
/// <param name="value">需要判断的值</param>
/// <param name="choice">可能值</param>
/// <returns>如果与任一个可能值相等则返回true</returns>
public static bool IsMatch(byte value, params byte[] choice)
{
if (choice == null || choice.Length == )
return false; foreach(byte item in choice)
{
if (item == value)
return true;
}
return false;
} /// <summary>
/// 将字节数组转换为HEX形式的字符串, 没有间隔符
/// </summary>
public static string ByteToHex(byte[] buf)
{
return ByteToHex(buf, string.Empty);
} /// <summary>
/// 将字节数组转换为HEX形式的字符串
/// 转换后的字符串长度为字节数组长度的两倍
/// 如: 1, 2 转换为 0102
/// </summary>
public static string ByteToHex(byte b)
{
return string.Empty + HEX_CHARS[b >> ] + HEX_CHARS[b & 0x0F];
} /// <summary>
/// 将字节流信息转换为HEX字符串
/// </summary>
public static string DumpBytes(byte[] bytes)
{
return DumpBytes(bytes, , bytes.Length);
} /// <summary>
/// 将字节流信息转换为HEX字符串
/// </summary>
public static string DumpBytes(byte[] bytes, int offset, int len)
{
StringBuilder buf = new StringBuilder();
for(int i = ;i < len;i++)
{
if (i == || i % == )
buf.AppendLine(); buf.Append(ByteToHex(bytes[i + offset]));
buf.Append(' ');
}
buf.AppendLine();
return buf.ToString();
} /// <summary>
/// 计算字节块的模256校验和
/// </summary>
public static byte SumBytes(byte[] bytes, int offset, int len)
{
int sum = ;
for(int i = ;i < len;i++)
{
sum += bytes[i + offset];
if (sum >= )
{
sum = sum % ;
}
}
return (byte)sum;
} /// <summary>
/// 计算字节块的模256双字节校验和(低位在前)
/// </summary>
public static byte[] Sum2Bytes(byte[] bytes, int offset, int len)
{
int sum = ;
for(int i = ;i < len;i++)
sum += bytes[i + offset];
return new byte[] { (byte)(sum % ), (byte)(sum / ) };
} /// <summary>
/// 计算字节块的异或校验和
/// </summary>
public static byte XorSumBytes(byte[] bytes, int offset, int len)
{
byte sum = bytes[ + offset];
for(int i = ;i < len;i++)
{
sum = (byte)(sum ^ bytes[i + offset]);
}
return sum;
} /// <summary>
/// 计算字节块的异或校验和
/// </summary>
public static byte XorSumBytes(byte[] bytes)
{
return XorSumBytes(bytes, , bytes.Length);
} /// <summary>
/// 比较两个字节块是否相等。相等返回true否则false
/// </summary>
public static bool CompareBytes(byte[] bytes1, int offset1, byte[] bytes2, int offset2, int len)
{
for(int i = ;i < len;i++)
{
if (bytes1[i + offset1] != bytes2[i + offset2])
{
return false;
}
}
return true;
} /// <summary>
/// 将两个字符的hex转换为byte
/// </summary>
public static byte HexToByte(char[] hex, int offset)
{
byte result = ;
for(int i = ;i < ;i++)
{
char c = hex[i + offset];
byte b = ;
switch (c)
{
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '':
b = (byte)(c - '');
break;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
b = (byte)( + c - 'A');
break;
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
b = (byte)( + c - 'a');
break;
}
if (i == )
{
b = (byte)(b * );
}
result += b;
} return result;
} /// <summary>
/// 将两个字符的hex转换为byte
/// </summary>
public static byte HexToByte(byte[] hex, int offset)
{
char[] chars = {(char)hex[offset], (char)hex[offset + ]};
return HexToByte(chars, );
} /// <summary>
/// 转换16进制字符串为字节数组
/// <param name="hex">有分隔或无分隔的16进制字符串,如“AB CD EF 12 34...”或“ABCDEF1234...”</param>
/// <param name="dot">任意分隔字符,但不能是16进制字符</param>
/// <returns>字节数组</returns>
/// </summary>
public static byte[] HexToByte(string hex, params char[] dot) {
char[] ca = new char[];
List<byte> list = new List<byte>();
for (int i = , n = ; i < hex.Length; i++) {
if (Array.IndexOf<char>(dot, hex[i]) >= ) {
continue;
} switch (++n) {
case :
ca[] = hex[i];
break; case :
ca[] = hex[i];
list.Add(ByteUtil.HexToByte(ca, ));
n = ;
break;
}
} return list.ToArray();
} /// <summary>
/// 将uint变量分解为四个字节。高位在前。
/// </summary>
public static void UintToBytes(uint i, byte[] bytes, int offset)
{
bytes[offset] = (byte)((i & 0xFF000000) >> );
bytes[offset + ] = (byte)((i & 0x00FF0000) >> );
bytes[offset + ] = (byte)((i & 0x0000FF00) >> );
bytes[offset + ] = (byte)(i & 0x000000FF);
} /// <summary>
/// 将uint变量分解为四个字节。高位在前。
/// </summary>
public static byte[] UintToBytes(uint i)
{
byte[] bytes = new byte[];
bytes[] = (byte)((i & 0xFF000000) >> );
bytes[] = (byte)((i & 0x00FF0000) >> );
bytes[] = (byte)((i & 0x0000FF00) >> );
bytes[] = (byte)(i & 0x000000FF);
return bytes;
} /// <summary>
/// 将int变量分解为四个字节。高位在前。
/// </summary>
public static byte[] IntToBytes(int i)
{
byte[] data = BitConverter.GetBytes(i);
Array.Reverse(data);
return data; //byte[] bytes = new byte[4];
//bytes[0] = (byte)((i & 0xFF000000) >> 24);
//bytes[1] = (byte)((i & 0x00FF0000) >> 16);
//bytes[2] = (byte)((i & 0x0000FF00) >> 8);
//bytes[3] = (byte)(i & 0x000000FF);
//return bytes;
} /// <summary>
/// 将四个字节合成为一个int
/// </summary>
public static uint BytesToUint(byte[] bytes, int offset)
{
uint a = ((uint)bytes[offset]) << ;
uint b = ((uint)bytes[offset + ]) << ;
uint c = ((uint)bytes[offset + ]) << ;
uint d = bytes[offset + ];
return a + b + c + d;
} /// <summary>
/// 将ulong变量分解为八个字节。高位在前。
/// </summary>
public static byte[] UlongToBytes(ulong i)
{
byte[] bytes = new byte[];
bytes[] = (byte)((i & 0xFF00000000000000) >> );
bytes[] = (byte)((i & 0x00FF000000000000) >> );
bytes[] = (byte)((i & 0x0000FF0000000000) >> );
bytes[] = (byte)((i & 0x000000FF00000000) >> );
bytes[] = (byte)((i & 0x00000000FF000000) >> );
bytes[] = (byte)((i & 0x0000000000FF0000) >> );
bytes[] = (byte)((i & 0x000000000000FF00) >> );
bytes[] = (byte)(i & 0x00000000000000FF);
return bytes;
} /// <summary>
/// 将八个字节合成为一个ulong
/// </summary>
public static ulong BytesToUlong(byte[] bytes, int offset)
{
ulong a = ((ulong)bytes[offset]) << ;
ulong b = ((ulong)bytes[offset + ]) << ;
ulong c = ((ulong)bytes[offset + ]) << ;
ulong d = ((ulong)bytes[offset + ]) << ;
ulong e = ((ulong)bytes[offset + ]) << ;
ulong f = ((ulong)bytes[offset + ]) << ;
ulong g = ((ulong)bytes[offset + ]) << ;
ulong h = bytes[offset + ];
return a + b + c + d + e + f + g + h;
} /// <summary>
/// 设置某个字节的指定位
/// </summary>
/// <param name="b">需要设置的字节</param>
/// <param name="pos">1-8, 1表示最低位, 8表示最高位</param>
/// <param name="on">true表示设置1, false表示设置0</param>
public static void ByteSetBit(ref byte b, int pos, bool on)
{
int temp = BITS[pos - ]; if (!on)
{
//取反
temp = temp ^ 0xFF;
} b = (byte)(on?(b | temp):(b & temp));
} /// <summary>
/// 判断某个byte的某个位是否为1
/// </summary>
/// <param name="pos">第几位,大于等于1</param>
public static bool ByteGetBit(byte b, int pos)
{
int temp = BITS[pos - ];
return (b & temp) != ;
} /// <summary>
/// 设置双比特值
/// </summary>
/// <param name="b">需要设置的字节</param>
/// <param name="low">低位, 1-7</param>
/// <param name="val">值,0-3</param>
/// <returns></returns>
public static void ByteSetBitPair(ref byte b, int low, int val)
{
if (low < || low > )
{
throw new ArgumentException(string.Format("无效的low值:{0}", low));
} switch(val)
{
case :
{
ByteUtil.ByteSetBit(ref b, low, false);
ByteUtil.ByteSetBit(ref b, low + , false);
break;
}
case :
{
ByteUtil.ByteSetBit(ref b, low, true);
ByteUtil.ByteSetBit(ref b, low + , false);
break;
}
case :
{
ByteUtil.ByteSetBit(ref b, low, false);
ByteUtil.ByteSetBit(ref b, low + , true);
break;
}
case :
{
ByteUtil.ByteSetBit(ref b, low, true);
ByteUtil.ByteSetBit(ref b, low + , true);
break;
}
default:
{
throw new ArgumentException(string.Format("无效的val值:{0}", val));
}
}
} /// <summary>
/// 读取双比特值
/// </summary>
/// <param name="b">需要读取的字节</param>
/// <param name="low">低位, 0-6</param>
/// <returns>0-3</returns>
public static byte ByteGetBitPair(byte b, int low)
{
if (low < || low > )
{
throw new ArgumentException(string.Format("无效的low值:{0}", low));
} int x = ;
x += ByteUtil.ByteGetBit(b, low)?:;
x += ByteUtil.ByteGetBit(b, low + )?:; return (byte)x;
} /// <summary>
/// 将short转换为两个字节
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static byte[] ShortToByte(short s)
{
return UshortToByte((ushort)s);
} /// <summary>
/// 将ushort转换为两个字节
/// </summary>
public static byte[] UshortToByte(ushort u)
{
return new byte[]{
(byte)(u >> ),
(byte)(u & 0x00FF)
};
} /// <summary>
/// 将两个字节转换为一个short
/// </summary>
public static short BytesToShort(byte[] data, int offset)
{
short a = data[offset], b = data[offset + ];
return (short)((a << ) + b);
} /// <summary>
/// 将两个字节转换为一个short
/// </summary>
public static ushort BytesToUshort(byte[] data, int offset)
{
ushort a = data[offset], b = data[offset + ];
return (ushort)((a << ) + b);
} /// <summary>
/// 将四个字节转换为int
/// </summary>
/// <param name="data"></param>
/// <param name="offset"></param>
/// <returns></returns>
public static int BytesToInt(byte[] data, int offset)
{
return (data[offset] << ) + (data[offset + ] << ) + (data[offset + ] << ) + data[offset + ];
} /// <summary>
/// 将guid字符串转换为等价的16维字节数组
/// </summary>
public static byte[] GuidToBytes(string s)
{
byte[] guid = new byte[];
char[] hex = s.Replace("-", string.Empty).Replace(" ", string.Empty).ToCharArray();
for (int i = ; i < ; i += )
{
guid[i / ] = ByteUtil.HexToByte(hex, i);
}
return guid;
} /// <summary>
/// CRC16校验表
/// </summary>
static ushort[] wCRCTalbeAbs = {0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401, 0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400}; /// <summary>
/// 计数字节块的CRC16校验值
/// </summary>
public static int CRC16Bytes(byte[] bytes, int offset, int len)
{
int wCRC = 0xFFFF;
byte chChar; for (int i = offset; i < len; i++)
{
chChar = bytes[i];
wCRC = wCRCTalbeAbs[(chChar ^ wCRC) & ] ^ (wCRC >> );
wCRC = wCRCTalbeAbs[((chChar >> ) ^ wCRC) & ] ^ (wCRC >> );
} return wCRC;
} /// <summary>
/// 字节格式化,将字节转换为字节、KB、MB、GB显示
/// </summary>
/// <param name="bytes">字节数</param>
/// <returns>格式化后的字符串</returns>
public static string ByteFormater(long bytes)
{
const long KB = ;
const long MB = * ;
const long GB = * * ; if (bytes >= GB)
{
double result = bytes * 1.0 / GB;
return result.ToString("#,##0.0") + "GB";
}
if (bytes >= MB)
{
double result = bytes * 1.0 / MB;
return result.ToString("#,##0.0") + "MB";
}
if (bytes >= KB)
{
double result = bytes * 1.0 / KB;
return result.ToString("#,##0.0") + "KB";
}
return bytes.ToString("#,##0") + "字节";
}
}

byte数据的常用操作函数[转发]的更多相关文章

  1. R语言Data Frame数据框常用操作

    Data Frame一般被翻译为数据框,感觉就像是R中的表,由行和列组成,与Matrix不同的是,每个列可以是不同的数据类型,而Matrix是必须相同的. Data Frame每一列有列名,每一行也可 ...

  2. 转载:R语言Data Frame数据框常用操作

    Data Frame一般被翻译为数据框,感觉就像是R中的表,由行和列组成,与Matrix不同的是,每个列可以是不同的数据类型,而Matrix是必须相同的. Data Frame每一列有列名,每一行也可 ...

  3. Python--set常用操作函数

    python提供了常用的数据结构,其中之一就是set,python中的set是不支持索引的.值不能重复.无需插入的容器. 简单记录下set常用的操作函数: 1.新建一个set: set("H ...

  4. JavaScript之数组的常用操作函数

    js对数组的操作非常频繁,但是每次用到的时候都会被搞混,都需要去查相关API,感觉这样很浪费时间.为了加深印象,所以整理一下对数组的相关操作. 常用的函数 concat() 连接两个或更多的数组,并返 ...

  5. R语言︱基本函数、统计量、常用操作函数

    先言:R语言常用界面操作 帮助:help(nnet) = ?nnet =??nnet 清除命令框中所有显示内容:Ctrl+L 清除R空间中内存变量:rm(list=ls()).gc() 获取或者设置当 ...

  6. [转]pymongo常用操作函数

    pymongo 是 mongodb 的 python Driver Editor.记录下学习过程中感觉以后会常用多一些部分,以做参考. 1. 连接数据库 要使用pymongo最先应该做的事就是先连上运 ...

  7. pymongo 常用操作函数

    pymongo 是 mongodb 的 python Driver Editor. 记录下学习过程中感觉以后会常用多一些部分,以做参考. 1. 连接数据库 要使用pymongo最先应该做的事就是先连上 ...

  8. 入门大数据---SparkSQL常用聚合函数

    一.简单聚合 1.1 数据准备 // 需要导入 spark sql 内置的函数包 import org.apache.spark.sql.functions._ val spark = SparkSe ...

  9. MYSQL常用操作函数的封装

    1.mysql常用函数封装文件:mysql.func.php <?php /** * 连接MYSQL函数 * @param string $host * @param string $usern ...

随机推荐

  1. python实现查看目录下重复的文件

    该python 脚本有以下三个功能: 1. 实现查看目录下重复的文件,输出文件按修改时间升序排列 2. 将按修改时间排列比较旧的.可删除的文件列出来 3. 按目录对重复文件进行统计,比如,目录/tmp ...

  2. SCOI2009粉刷匠

    Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个 ...

  3. C语言的总结

    在C语言考试的中,我成绩不是很好,其实在学习C语言的时候我没有好好去学过,我知道了是我自己的错误,我不应该抱着侥幸的心里去上课的,我会去好好听课的哦l

  4. python——SQL基本使用

    终于学到数据库操作了,这意味着什么?以后再也不用从文件里读写数据了,过程实在太复杂了~~~为了纪念这个激动人心的时刻,一定要写一篇博客! 使用mysql数据库——增 插入一条数据 首先,还是先解释一下 ...

  5. [转]Python os.path模块

    os.path模块 原文链接:http://my.oschina.net/cuffica/blog/33494 basename('文件路径')    去掉目录路径,返回fname文件名 import ...

  6. javascript中运算符的优先级

    运算符优先级 JavaScript中的运算符优先级是一套规则.该规则在计算表达式时控制运算符执行的顺序.具有较高优先级的运算符先于较低优先级的运算符执行.例如,乘法的执行先于加法. 下表按从最高到最低 ...

  7. [转]IE8兼容Object.keys

    转自:http://blog.sina.com.cn/s/blog_6d63cf160102vbsg.html 只需要加入 var DONT_ENUM = "propertyIsEnumer ...

  8. org.apache.catalina.webresources.Cache.getResource Unable to add the resource

    org.apache.catalina.webresources.Cache.getResource Unable to add the resource at xxx to the cache be ...

  9. java selenium (十二) 操作弹出窗口

    selenium 中如何处理弹出窗口 阅读目录 原理 在代码里, 通过         Set<String> allWindowsId = driver.getWindowHandles ...

  10. java中this 关键字的使用

    在方法中定义使用的this关键字,它的值是当前对象的引用.也就是说你只能用它来调用属于当前对象的方法或者使用this处理方法中成员变量和局部变量重名的情况.而且,更为重要的是this和super都无法 ...