我正在创建一个Android应用程序,通过蓝牙将我的设备连接到嵌入式芯片。我在Palm Pilot上已经存在的程序(用C语言编写)之后对我的设计进行建模。我正在使用蓝牙聊天示例来运行我的代码,并且卡住了。我对整个编码世界还很陌生,并且让我自己感到困惑。
我想将以下代码从C转换为Java ....
SrmReceive(portId,&c,1,(t*5L*Sec)/1000L,&err)
我在这里唯一真正的问题是第三个参数。 1
代表number of bytes to receive
,如手掌文档中所述,属UInt32
类型。
蓝牙聊天示例中的代码具有以下用于读取数据的功能...
public void run() {
Log.i( TAG, "BEGIN mConnectedThread" );
buffer = new byte[1024];
int bytes;
// Keep listening to the InputStream while connected
while( true ) {
try {
// Read from the InputStream
bytes = mmInStream.read( buffer );
// Send the obtained bytes to the UI Activity
mHandler.obtainMessage( BtHelperHandler.MessageType.READ, bytes, buffer).sendToTarget();
} catch ( IOException e ) {
Log.e( TAG, "disconnected", e );
sendErrorMessage( 1 );
break;
}
}
}
我想更改run()
方法以获取要读取的特定字节数的参数。我有点担心该做什么。我在想...
public void run( int size ) {
buffer = new byte[size];
...
}
但这对我来说似乎并不合适,我觉得我混淆了我对字节的定义。可能听起来很愚蠢,但我对这些信息还不够充分。将UInt32
转换为java会让我感到困惑,因为java没有等效的类型。如果有人知道,请告诉我。
答案 0 :(得分:2)
没有理由感到困惑,你所做的是正确的。假设 mmInStream 是 InputStream 的实例;
byte[] buffer = new byte[1024];
int bytes = mmInStream.read(buffer);
将读取最多1024个字节的可用内容,并返回读取的字节数。这是一种低级别的数据流方法,这很好,它只是意味着你必须知道如何使用这个字节数组。
如果你经常阅读原语,你可能想看看 DataInputStream ,就像这样使用它;
DataInputStream dat = new DataInputStream(mmInStream);
int x = dat.readInt();
将从您的流中读取32位数据(4个字节),并将它们排成一个java int原语。值得注意的是endianness和签名/未签名的混淆。如果遇到问题,使用<<<<<<<<<<<<<运算符,依次添加每个字节,然后左移8位。
在你的情况下,我要做的只是看一下读取后缓冲区中的值,并弄清楚究竟是什么发送,眼球可能很重要因为我给出的两个原因。