我创建了一个蓝牙数据侦听器,该侦听器将传入的数据存储到using FFTW
using Plots
using WAV, PlotlyJS
snd, sampFreq = wavread("input.wav")
N, _ = size(snd)
t = 0:1/(N-1):1;
s = snd[:,1]
y = fft(s)
y1 = copy(y)
for i = 1:N
if abs(y1[i]) > 800
y1[i] = 0
end
end
s_new = real(ifft(y1))
wavwrite(s_new, "output1.wav", Fs = sampFreq)
y2 = copy(y)
for i = 1:N
if abs(y2[i]) < 800
y2[i] = 0
end
end
s_new = real(ifft(y2))
wavwrite(s_new, "output2.wav", Fs = sampFreq)
sticks((abs.(y1)))
sticks!((abs.(y2)))
s1,k1 = wavread("output1.wav")
s2,k2 = wavread("output2.wav")
for i = 1:N
s1[i] += s2[i]
end
wavwrite(s1, "output3.wav", Fs = sampFreq)
中,然后检查它是否与正则表达式模式匹配,然后重置String
。这样做是因为数据不会在一个实例中全部到达,因此我在获取全文时可以使用它进行操作。例如,当我使用自己的方法通过蓝牙将String
发送到设备并打印数据时,数据将像这样打印:
"Hello Android!"
#1 New data! "H"
如您所见,整个字符串无法在一个实例中发送,这意味着将发送两个字符串,并且我敢肯定,大多数人都知道这一点。这就是为什么我使用#2 New data! "ello Android!
来帮助我。
相反,我在两个不同的字符之间发送了一个随机生成的数字,然后尝试解析它们。例如RegEx
。现在,我想获取整数,以便可以使用它,例如将其解析为int或类似的东西。但是只有当我的"<128>"
缓冲区获得要发送的全部数据时,该数据才由String
模式决定,该模式类似于RegEx
。 ([<])(-?\d+)([>])
<character
。
问题在于,由于未知原因,它根本与模式不匹配。
followed by any positive/negative number followed by character '>'
这是实时输出:
String szBuffer = "";
if(mmInputStream.available() > 0) {
StringBuilder builder = new StringBuilder();
byte[] bData = new byte[1024];
while(mmInputStream.available() > 0) {
int read = mmInputStream.read(bData);
builder.append(new String(bData, 0, read, StandardCharsets.UTF_8));
}
szBuffer += builder.toString();
Log.d("SZ_BUFFER", szBuffer); // For this example, "<128>" gets sent into pieces.
// <n>
if(Pattern.matches("([<])(-?\\d+)([>])", szBuffer)) {
Log.d("SZ_BUFFER_ISMATCH", "MATCH!");
szBuffer = ""; // Reset the buffer for new data
}
else
Log.d("SZ_BUFFER_ISMATCH", "NO MATCH...");
}
如您所见,它被分成两部分发送,但是当将整个文本放在一起时,它应该是一个匹配项,但不是。为什么?如果我将D/SZ_BUFFER: <
D/SZ_BUFFER_ISMATCH: NO MATCH...
D/SZ_BUFFER: <128>
D/SZ_BUFFER_ISMATCH: NO MATCH...
替换为常量szBuffer
,如下所示:
String
这是一个匹配项,这意味着该模式应该正确,但是当它检查if(Pattern.matches("([<])(-?\\d+)([>])", "<128>"))
时就永远不会匹配。
答案 0 :(得分:1)
根据文档,Pattern.matches(regex,string)
等效于Pattern.compile(regex).matcher(string).matches()
,等效于string.matches(regex)
。这意味着您正在检查整个字符串是否与正则表达式匹配。如果要检查字符串是否包含字符串结尾标记,可以改用Matcher.find
:
Pattern pattern = Pattern.compile("([<])(-?\\d+)([>])");
String szBuffer = "";
if(mmInputStream.available() > 0) {
...
szBuffer += convertedBytes;
Log.d("SZ_BUFFER", szBuffer);
// <n>
if(pattern.matcher(szBuffer).find()) {
Log.d("SZ_BUFFER_ISMATCH", "MATCH!");
szBuffer = "";
}
else
Log.d("SZ_BUFFER_ISMATCH", "NO MATCH...");
}
答案 1 :(得分:1)
问题在于数据包含不可见字符,这是通过使数据长度错误来确认的。解决方案是检查每个字符,然后仅在它们符合某些条件(如正则表达式方法)时存储它们:
for(char c : builder.toString().toCharArray()) {
String s = String.valueOf(c);
if(Pattern.matches("<|>|-|-?\\d+", s)){
szBuffer += s;
}
}
这不是最好也不是最干净的解决方案,但是它确实解决了我的问题。我仍在学习正则表达式以及算法中的许多组合。欢迎所有新建议,这些建议将添加到此建议的下方。