整数到字节和字节到整数的转换 - java

时间:2014-05-05 03:03:20

标签: java android samsung-mobile-sdk

我正在开发基于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();
}  

1 个答案:

答案 0 :(得分: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();

P.S。这不是漂亮的代码!对于基本的int是可以忍受的,但是如果你以后发现需要传输更复杂的数据结构,那么你需要一种更好的方法。一些想法,按复杂程度递增:

  • 使用data streams(围绕ByteArrayOutputStream包装DataOutputStream;写入值;完成编写后,关闭DataOutputStream并在ByteArrayOutputStream上调用toByteArray()以获取有效负载。)
  • 使用serialization(围绕ByteArrayOutputStream包装ObjectOutputStream;写入值和/或对象;完成上述步骤。)
  • 使用JSON编码器或XML编码器。 (例如,将数据编码为字符串,然后在字符串上调用getBytes("UTF-8")并发送。)