-1

我正在开发基于 Samsung Chord SDK 的应用程序。我需要在 sendDataToAll() 中发送视频的当前位置,它接受 byte[][] 中的数据。我的问题是,当我尝试发送类型转换为字节的当前位置(这是一个 int)时,我得到了返回的负值(以字节为单位)。当我尝试在 OnDataRecived() 中将负值转换为 int 时,它仍然是相同的负值。我该如何解决这个问题?

Sending code:

//for sending the message 
int currPos = mVideoView.getCurrentPosition();
logView.append("Duration sent= " + currPos);
//Integer resume = -3;

Byte msgByte = new Byte("-3");
byte [] [] pay = new byte [1] [2];
pay[0] [0] = msgByte;

Byte msgByte2 = new Byte((byte) currPos);
logView.append("Duration sent= " + msgByte2);
pay[0] [1] = msgByte2;
mChordchannel.sendDataToAll("Integer", pay);

// im sending -3 so that im checking that the user pressed the resume .
Receiving code:

 //on receiving 
else if(intRec == -3) {
    Byte pos = rec[0] [1];
    int posn;
    posn = pos.intValue();
    logView.append("Duration received= " + posn);
    mVideoView.seekTo(posn);
    mVideoView.start();
}  
4

1 回答 1

1

我对 Samsung Chord SDK 一无所知,但你不能将(大多数)整数放入一个字节中。一个 int 是4个字节宽。

要创建与您当前代码兼容的有效负载,它会发送所有 4 个字节:

byte[][] payload = { {
    -3,
    (byte)(currPos >> 24),
    (byte)(currPos >> 16),
    (byte)(currPos >>  8),
    (byte)(currPos >>  0),
} };
mChordchannel.sendDataToAll("Integer", payload);

受到:

int position = new java.math.BigInteger(
    Arrays.copyOfRange(rec[0], 1, 5)).intValue();

PS 这不是漂亮的代码!对于基本整数是可以容忍的,但如果您后来发现需要传输更复杂的数据结构,您将需要更好的方法。一些想法,按复杂程度递增:

  • 使用数据流(将 DataOutputStream 包裹在 ByteArrayOutputStream 周围;写入值;完成写入后,关闭 DataOutputStream 并调用toByteArray()ByteArrayOutputStream 以获取有效负载)。
  • 使用序列化(将 ObjectOutputStream 包裹在 ByteArrayOutputStream 周围;写入值和/或对象;如上完成)。
  • 使用 JSON 编码器或 XML 编码器。(例如,将数据编码为字符串,然后调用getBytes("UTF-8")字符串并发送。)
于 2014-05-05T05:19:47.670 回答