Unity蓝牙LE数据处理:C#将byte数组转sbyte数组
解决Unity中蓝牙LE byte数组转sbyte数组的问题
问题原因
你碰到的“数值过小或过大”错误,本质是两个代码逻辑问题:
sbyte.Parse()默认按十进制解析字符串,但你传入的是二进制字符串,导致数值远超sbyte的范围(-128~127);- 错误移除了二进制字符串的首位,破坏了有符号数的补码结构,导致转换逻辑完全错误。
其实根本不需要绕字符串转换,C#本身支持直接把byte强制转换为sbyte,这是最简洁高效的方式。
正确实现方式
单个byte转sbyte
直接强制类型转换即可,C#会自动处理补码转换,完美匹配你的需求:
byte inputByte = 186; sbyte outputSByte = (sbyte)inputByte; // 结果就是你要的 -70
批量转换整个数组
如果要把蓝牙返回的整个byte数组转成sbyte数组,一行代码搞定:
byte[] bluetoothData = { 83, 186, 1, 3 }; sbyte[] signedData = Array.ConvertAll(bluetoothData, b => (sbyte)b); // 转换后数组:[83, -70, 1, 3]
如果你坚持用字符串转换(不推荐)
如果一定要用二进制字符串的方式转换,必须指定解析格式为二进制,并且保留完整的8位二进制:
byte target = 186; // 生成8位长度的二进制字符串(自动补前导0) string binaryStr = Convert.ToString(target, 2).PadLeft(8, '0'); // 用Convert.ToSByte指定解析二进制 sbyte result = Convert.ToSByte(binaryStr, 2); // 结果为 -70
你的代码修正版
把你原来的代码改成这样就能正常运行:
int x = 0; int y = 0; int z = 0; // 补全变量声明 byte targetByte = bytes[3]; string binaryResult = Convert.ToString(targetByte, 2).PadLeft(8, '0'); Debug.Log($"First Conversion: {binaryResult} Original: {targetByte}"); sbyte convertedSByte = Convert.ToSByte(binaryResult, 2); Debug.Log($"Conversion: {convertedSByte} Original: {targetByte}");
内容的提问来源于stack exchange,提问作者TikTokExperience
相关产品推荐
相关产品推荐

