You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity蓝牙LE数据处理:C#将byte数组转sbyte数组

解决Unity中蓝牙LE byte数组转sbyte数组的问题

问题原因

你碰到的“数值过小或过大”错误,本质是两个代码逻辑问题:

  1. sbyte.Parse() 默认按十进制解析字符串,但你传入的是二进制字符串,导致数值远超sbyte的范围(-128~127);
  2. 错误移除了二进制字符串的首位,破坏了有符号数的补码结构,导致转换逻辑完全错误。

其实根本不需要绕字符串转换,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:15:39