通过I / O流接收一定数量的字节

时间:2012-07-23 14:09:21

标签: java android io bluetooth palm

我正在创建一个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没有等效的类型。如果有人知道,请告诉我。

1 个答案:

答案 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位。

在你的情况下,我要做的只是看一下读取后缓冲区中的值,并弄清楚究竟是什么发送,眼球可能很重要因为我给出的两个原因。