字节序(Endianness)的理解和字符串截取逻辑 问题出在字节序Endianness的理解和字符串截取逻辑上。当前代码输出3F80 0000对应1.0f其实是标准的大端序Big-Endian。而期望的正确结果是0000 803F这实际上是小端序Little-Endian下每 2 个字节Word交换或直接按字节流输出的结果。代码中的主要漏洞在这一步uintuintValBitConverter.ToUInt32(bytes,0);stringhex8uintVal.ToString(X8);// 这一步把小端字节数组强行转成了大端字面的 Hex 字符串在 Windows (x86/x64) 环境下BitConverter.GetBytes(1.0f)得到的字节数组是[0x00, 0x00, 0x80, 0x3F]小端。当用ToUInt32读取它时它在内存中代表的就是0x3F800000。接着用X8转换就把低位的0000甩到了右边变成了3F800000导致后面的Substring逻辑完全颠倒了。️ 优化与修复方案直接操作字节流Byte Array是最安全、最高效的做法完全不需要通过uint和Substring绕弯子。以下是优化后的完整代码精简了逻辑提升了性能并确保正反向解析结果完全正确。usingSystem;usingSystem.Globalization;usingSystem.Text;usingWinFormsMainDriver.Model;namespaceWinFormsMainDriver.Protocol{publicclassParseHexStringToPIHelper{publicstaticvoidTest(){varpinewPIParameters{PI_AC_q_P1f,PI_AC_q_I2f,PI_AC_d_P3f,PI_AC_d_I4f,PI_DC_q_P5f,PI_DC_q_I6f,PI_DC_d_P7f,PI_DC_d_I8f};stringresultConvertPIToLabVIEWHex(pi);Console.WriteLine( LabVIEW 连接的字符串 );Console.WriteLine(result);// 验证反向解析varparsedPiParseFromLabVIEWHex(result);Console.WriteLine($\n验证反向解析 AC_q_P:{parsedPi.PI_AC_q_P}(应为 1));Console.WriteLine($验证反向解析 DC_d_I:{parsedPi.PI_DC_d_I}(应为 8));}/// summary/// 编码将 float 数组转为 LabVIEW 期望的 Hex 字符串 (小端 16位分组)/// /summarypublicstaticstringConvertPIToLabVIEWHex(PIParameterspi){float[]values{pi.PI_AC_q_P,pi.PI_AC_q_I,pi.PI_AC_d_P,pi.PI_AC_d_I,pi.PI_DC_q_P,pi.PI_DC_q_I,pi.PI_DC_d_P,pi.PI_DC_d_I};// 预分配容量以提高性能8个float * (4位Hex 空格 4位Hex 空格) 80StringBuildersbnewStringBuilder(80);foreach(floatfinvalues){// Windows 下默认是 Little-Endian (小端)1.0f - [0x00, 0x00, 0x80, 0x3F]byte[]bytesBitConverter.GetBytes(f);// 如果在非小端系统上运行极少见手动翻转以确保是小端if(!BitConverter.IsLittleEndian){Array.Reverse(bytes);}// 期望格式: 0000 803F// bytes[0]00, bytes[1]00 - 0000// bytes[2]80, bytes[3]3F - 803Fsb.Append(bytes[0].ToString(X2)).Append(bytes[1].ToString(X2)).Append( ).Append(bytes[2].ToString(X2)).Append(bytes[3].ToString(X2)).Append( );}returnsb.ToString().TrimEnd();}/// summary/// 解码将 LabVIEW Hex 字符串反向解析为 PIParameters/// /summarypublicstaticPIParametersParseFromLabVIEWHex(stringhexString){// 去除空格stringcleanhexString.Replace( ,).Trim();if(clean.Length!64)// 8个float * 8个Hex字符 64thrownewArgumentException(Hex字符串长度不正确。);float[]valuesnewfloat[8];byte[]tempBytesnewbyte[4];for(inti0;i8;i){stringsingleFloatHexclean.Substring(i*8,8);// 例如 0000803F// 还原为小端字节数组tempBytes[0]byte.Parse(singleFloatHex.Substring(0,2),NumberStyles.HexNumber);tempBytes[1]byte.Parse(singleFloatHex.Substring(2,2),NumberStyles.HexNumber);tempBytes[2]byte.Parse(singleFloatHex.Substring(4,2),NumberStyles.HexNumber);tempBytes[3]byte.Parse(singleFloatHex.Substring(6,2),NumberStyles.HexNumber);// 如果当前系统是大端如某些嵌入式需要翻转以适配 BitConverter.ToSingleif(!BitConverter.IsLittleEndian){Array.Reverse(tempBytes);}values[i]BitConverter.ToSingle(tempBytes,0);}returnnewPIParameters{PI_AC_q_Pvalues[0],PI_AC_q_Ivalues[1],PI_AC_d_Pvalues[2],PI_AC_d_Ivalues[3],PI_DC_q_Pvalues[4],PI_DC_q_Ivalues[5],PI_DC_d_Pvalues[6],PI_DC_d_Ivalues[7]};}}} 为什么这样优化更好消除了不必要的转换避免了float - bytes - uint - string - substring的冗长链路。直接通过bytes[i].ToString(X2)精准控制每一个字节输出的位置。性能更优*StringBuilder初始化时给定了预估容量80避免了多次扩容的内存开销。移除了Array.Reverse在编码时等产生额外开销的操作。跨平台安全性增加了对BitConverter.IsLittleEndian的兜底判断确保代码在罕见的大端序 CPU 环境下依然能解析出正确的数据流。