C#计算XOR校验和时十六进制字符串‘2E’转换报错问题
解决十六进制字符串转byte时的格式错误问题
你遇到的问题是因为Convert.ToByte(string)默认以十进制解析字符串,而"2E"里的E会被当作科学计数法的标识,导致解析失败。要正确解析十六进制字符串,必须显式指定解析格式为十六进制。
修正后的代码
public void GetCheckSum() { //test data2 //预期结果42 var hexInput = "54-33-30-30-20-20-20-20-38-2E-30-03"; // 指定按十六进制解析每个分段 var splitByte = hexInput.Split("-").Select(hex => Convert.ToByte(hex, 16)); byte[] byteData = splitByte.ToArray(); byte checksumTest = 0; // 直接初始化0,无需new byte() for(int i = 0; i < byteData.Length; i++) { checksumTest = (byte)(checksumTest ^ byteData[i]); } Console.WriteLine(checksumTest); // 输出42,符合预期 }
额外优化:用LINQ简化XOR计算
可以用Aggregate方法替代循环,让代码更简洁:
public void GetCheckSum() { var hexInput = "54-33-30-30-20-20-20-20-38-2E-30-03"; byte checksum = hexInput.Split("-") .Select(hex => Convert.ToByte(hex, 16)) .Aggregate((current, next) => (byte)(current ^ next)); Console.WriteLine(checksum); // 输出42 }
注意点
- 解析十六进制字符串时,必须传入第二个参数
16,告诉Convert.ToByte按十六进制规则解析,这样不管是数字还是A-F(大小写都支持)的十六进制字符都能正确转换。 - 原代码里
checksumTest和checkSumTest大小写不一致,已统一修正,避免编译错误。
内容的提问来源于stack exchange,提问作者BTOM
相关产品推荐
相关产品推荐

