我知道以前在这里问过类似的问题,但我没有找到任何适合我的东西,所以我很绝望。
我从蓝牙接收了许多用逗号分隔的值,并且我以字符串形式接收它们。它们可以是正十进制数或负十进制数。例如: 0, 1.11, 2.22, -3.33, -4.44, 55.55, 66.66, -77.77, 8.88, 0
但是,我无法按原样提取所有数字。我尝试过正则表达式,我尝试过拆分和解析,我尝试解析为十进制,双精度,但是每次我都会遇到 Parse 函数未经处理的异常。
感谢任何对最终解决方案的帮助。
编辑: 这是我尝试解析的代码部分:
public static void AddToGraphs(string list) {
try
{
var data = list.Split(',').Select(x => double.Parse(x, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture));
double[] dataArray = data.ToArray();
}
catch (Java.IO.IOException e)
{
Log.WriteLine(LogPriority.Error, e.Source, e.Message);
}
}
下面是应用崩溃时的调用堆栈:
0xFFFFFFFFFFFFFFFF in
System.Diagnostics.Debugger.Mono_UnhandledException_internal C#
0x1 in System.Diagnostics.Debugger.Mono_UnhandledException C#
0x26 in object.6f90deee-2618-4e76-9135-3c21efb2de46 C#
0x96 in System.Number.ParseDouble C#
0x3 in double.Parse C#
0xE in double.Parse C#
0x8 in Namespace.<>c.<AddToGraphs>b__38_0 C#
0x26 in System.Linq.Enumerable.SelectArrayIterator<string,double>.ToArray C#
0x20 in System.Linq.Enumerable.ToArray<double> C#
0x37 in Namespace.Page3Fragment.AddToGraphs C#
0x5A in Namespace.Page1Fragment.MyHandler.HandleMessage C#
0x11 in Android.OS.Handler.n_HandleMessage_Landroid_os_Message_ C#
0x17 in object.6f90deee-2618-4e76-9135-3c21efb2de46 C#
编辑: 这是日志猫,在应用程序崩溃之前记录了"list"变量:
Time Device Name Type PID Tag Message
07-31 00:55:30.097 Samsung SM-G610F Info 32398 Test 0
07-31 00:55:30.157 Samsung SM-G610F Info 32398 Test , 1.11, 2.
编辑: 这是将接收到的数据发送到处理程序的蓝牙服务:
byte[] buffer = new byte[8192];
int bytes;
while (true)
{
bytes = ipStream.Read(buffer, 0, buffer.Length);
try
{
myService.myHandler.ObtainMessage(Page1Fragment.DATA_READ, bytes, -1, buffer).SendToTarget();
}
catch (Java.IO.IOException e)
{
throw e;
}
}
下面是接收并传递给 AddToGraphs 函数的处理程序的代码段:
private class MyHandler : Handler
{
Page1Fragment page1;
public MyHandler(Page1Fragment _page1)
{
page1 = _page1;
}
public override void HandleMessage(Message msg)
{
byte[] readBuf = (byte[])msg.Obj;
string inData = Encoding.ASCII.GetString(readBuf, 0, msg.Arg1);
Page3Fragment.AddToGraphs(inData);
}
}
这应该可以解决问题:
var data = "0, 1.11, 2.22, -3.33, -4.44, 55.55, 66.66, -77.77, 8.88, 0";
var arr = Array.ConvertAll(data.Split(','),
x => double.Parse(x,CultureInfo.InvariantCulture));
解析实数时应使用正确的区域性。查看此线程
至于你的任务,我会这样做:
var numbers = "0, 1.11, 2.22, -3.33, -4.44, 55.55, 66.66, -77.77, 8.88, 0"
.Split(new char [] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => double.Parse(x, CultureInfo.InvariantCulture)).ToArray();
编辑:
问题是信息不会一下子出现。因此,您需要创建一个缓冲区来存储数据,直到获得整个消息。
此外,如果您事先不知道消息的长度,则应将其作为消息的一部分发送,例如前 4 个字节 (Int32(。