[C#]我自己写的一个对字节中每位进行修改值的函数

本文详细介绍了如何通过位操作来设置和获取字节中特定位的值。提供了具体的代码实现,并通过测试案例验证了方法的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

位操作方法

代码如下:

1. 设置字节中某位的值

static public Byte s_SetBit(Byte byTargetByte, int nTargetPos, int nValue)
{
	int nValueOfTargetPos = -1;

	if (nValue != 0 && nValue != 1)
	{
		return 0;
	}
	if (!(nTargetPos >= 0 && nTargetPos < 8))
	{
		return 0;
	}

	switch (nTargetPos)
	{
		case 0:
			nValueOfTargetPos = (byTargetByte >> 7) & 0x01;
			if (nValue == 1)
			{
				byTargetByte = Convert.ToByte(byTargetByte | 0x80);
			}
			else if (nValue == 0)
			{
				byTargetByte = Convert.ToByte(byTargetByte & 0x7f);
			}
			break;

		case 1:
			nValueOfTargetPos = (byTargetByte >> 6) & 0x01;

			if (nValue == 1)
			{
				byTargetByte = Convert.ToByte(byTargetByte | 0x40);
			}
			else if (nValue == 0)
			{
				byTargetByte = Convert.ToByte(byTargetByte & 0xbf);
			}
			break;

		case 2:
			nValueOfTargetPos = (byTargetByte >> 5) & 0x01;

			if (nValue == 1)
			{
				byTargetByte = Convert.ToByte(byTargetByte | 0x20);
			}
			else if (nValue == 0)
			{
				byTargetByte = Convert.ToByte(byTargetByte & 0xdf);
			}
			break;

		case 3:
			nValueOfTargetPos = (byTargetByte >> 4) & 0x01;

			if (nValue == 1)
			{
				byTargetByte = Convert.ToByte(byTargetByte | 0x10);
			}
			else if (nValue == 0)
			{
				byTargetByte = Convert.ToByte(byTargetByte & 0xef);
			}
			break;

		case 4:
			nValueOfTargetPos = (byTargetByte >> 3) & 0x01;

			if (nValue == 1)
			{
				byTargetByte = Convert.ToByte(byTargetByte | 0x08);
			}
			else if (nValue == 0)
			{
				byTargetByte = Convert.ToByte(byTargetByte & 0xf7);
			}
			break;

		case 5:
			nValueOfTargetPos = (byTargetByte >> 2) & 0x01;

			if (nValue == 1)
			{
				byTargetByte = Convert.ToByte(byTargetByte | 0x04);
			}
			else if (nValue == 0)
			{
				byTargetByte = Convert.ToByte(byTargetByte & 0xfb);
			}
			break;

		case 6:
			nValueOfTargetPos = (byTargetByte >> 1) & 0x01;

			if (nValue == 1)
			{
				byTargetByte = Convert.ToByte(byTargetByte | 0x02);
			}
			else if (nValue == 0)
			{
				byTargetByte = Convert.ToByte(byTargetByte & 0xfd);
			}
			break;

		case 7:
			nValueOfTargetPos = byTargetByte & 0x01;

			if (nValue == 1)
			{
				byTargetByte = Convert.ToByte(byTargetByte | 0x01);
			}
			else if (nValue == 0)
			{
				byTargetByte = Convert.ToByte(byTargetByte & 0xfe);
			}
			break;

		default:
			break;
	}

	if (nValueOfTargetPos != -1)
	{
		return byTargetByte;
	}
	else
	{
		return 0;
	}
}


测试案例:

把每位全为1的字节置0

Byte b = Convert.ToByte(0xff);
richTextBoxMain.Text = "byte初始状态: " + Convert.ToString(b, 2).PadLeft(8, '0') + "\r\n";
for (int i = 0; i < 8; i++)
{
	b = s_SetBit(b, i, 0);
	richTextBoxMain.Text += "byte修改第" + i + "位后的结果: ";
	richTextBoxMain.Text += Convert.ToString(b, 2).PadLeft(8, '0') + "\r\n";
}

结果如下:

byte初始状态: 11111111
byte修改第0位后的结果: 01111111
byte修改第1位后的结果: 00111111
byte修改第2位后的结果: 00011111
byte修改第3位后的结果: 00001111
byte修改第4位后的结果: 00000111
byte修改第5位后的结果: 00000011
byte修改第6位后的结果: 00000001
byte修改第7位后的结果: 00000000

 

 

2. 获得字节中某位的值

static public int s_GetBit(Byte byTargetByte, int nTargetPos)
{
	int nValue = -1;

	switch (nTargetPos)
	{
		case 0:
			nValue = (byTargetByte >> 7) & 0x01;
			break;
		case 1:
			nValue = (byTargetByte >> 6) & 0x01;
			break;
		case 2:
			nValue = (byTargetByte >> 5) & 0x01;
			break;
		case 3:
			nValue = (byTargetByte >> 4) & 0x01;
			break;
		case 4:
			nValue = (byTargetByte >> 3) & 0x01;
			break;
		case 5:
			nValue = (byTargetByte >> 2) & 0x01;
			break;
		case 6:
			nValue = (byTargetByte >> 1) & 0x01;
			break;
		case 7:
			nValue = byTargetByte & 0x01;
			break;
		default:
			break;
	}

	return nValue;
}

 

 


<think>嗯,用户想在C# .NET Core 3.1上实现一个生成32MD5函数。首先,我需要确认.NET Core 3.1是否支持MD5的相关类。记得在.NET中,System.Security.Cryptography命名空间下有MD5类,应该适用于Core版本。 然后,用户需要的是32的MD5,通常MD5生成的是128的哈希,用十六进制表示就是32个字符。所以正确的做法应该是计算MD5哈希,然后将其转换为十六进制字符串,长度为32。 接下来,我需要考虑如何正确使用C#中的MD5.Create()方法,不过要注意资源释放的问题,所以应该用using语句来包裹MD5实例,避免内存泄漏。 然后,计算哈希的步骤应该是:将输入字符串转换为字节数组,使用ComputeHash方法得到哈希字节数组,再将每个字节转换为两的十六进制字符串,最后拼接起来。这里要注意字节到十六进制的转换,确保小字母,可能需要使用ToString("x2")。 另外,可能需要处理空字符串或null的情况,添加适当的参数验证,比如抛出ArgumentNullException。 还要检查示例代码是否正确,比如使用BitConverter.ToString可能会有连字符的问题,所以应该遍历每个字节并格式化为两十六进制,而不是用Replace方法替换连字符,这样更可靠。 最后,根据用户提供的引用,特别是引用[2]中提到.NET Core 3.1的目标框架,确保代码示例中的项目文件是否正确引用了目标框架,比如netcoreapp3.1,虽然用户的问题是关于这个版本的,所以代码应该兼容。 可能还需要考虑性能问题,比如多次调用这个函数时,是否应该重用MD5实例,但考虑到MD5.Create()在using块中,每次调用都会创建新的实例,这在.NET Core中是否是线程安全的?通常每个实例不是线程安全的,所以每次创建新的实例是安全的做法。 总结一下步骤:参数校验,创建MD5实例,计算哈希,转换为十六进制字符串,处理成小32,返回结果。确保代码示例正确无误,没有语法错误,并符合.NET Core 3.1的标准。</think>### 如何在C# .NET Core 3.1中实现32MD5哈希函数? #### 实现步骤 1. **引入命名空间**: 使用`System.Security.Cryptography`和`System.Text`以访问MD5类和编码功能。 2. **参数校验**: 若输入字符串为空或null,需抛出`ArgumentNullException`异常[^2]。 3. **计算MD5哈希**: - 通过`MD5.Create()`创建实例(需用`using`确保资源释放)。 - 将输入字符串转换为UTF-8字节数组。 - 调用`ComputeHash()`生成128(16字节)哈希数据。 4. **转换为32十六进制字符串**: 遍历每个字节,使用`ToString("x2")`格式化为两十六进制字符,拼接成最终字符串。 #### 示例代码 ```csharp using System; using System.Security.Cryptography; using System.Text; public static class MD5Helper { public static string GetMD5Hash(string input) { if (string.IsNullOrEmpty(input)) throw new ArgumentNullException(nameof(input)); using (MD5 md5 = MD5.Create()) { byte[] inputBytes = Encoding.UTF8.GetBytes(input); byte[] hashBytes = md5.ComputeHash(inputBytes); StringBuilder sb = new StringBuilder(); foreach (byte b in hashBytes) { sb.Append(b.ToString("x2")); // 小32 } return sb.ToString(); } } } // 调用示例 string hash = MD5Helper.GetMD5Hash("HelloWorld"); // 返回类似"68e109f0f40ca72a15e05cc22786f8e6" ``` #### 注意事项 - **大小控制**:`x2`表示小,`X2`表示大。 - **性能优化**:频繁调用时可将`MD5`实例池化(需注意线程安全)。 - **哈希碰撞风险**:MD5已被证实存在碰撞漏洞,若需加密安全请改用SHA-256[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值