Java:自定义到字节转换

时间:2016-05-27 19:05:14

标签: java bit-manipulation byte

我正在使用一些低容量模块,我需要尽可能地压缩数据。数据如下所示:

DeviceEvent:

  • 1个字节:
    • 2位状态(每次00)
    • 6位用于rgb颜色(3 x 2位)
  • 2个字节:从现在到特定日期时间的分钟数

我需要创建一个构造函数(最好是2个构造函数),用于从/到的转换:

事件:

  • byte []颜色(rgb,颜色将简化为仅64可用)
  • 某个日期时间(但我会得到差异的整数,以分钟为单位,它会小到足以容纳两位)

基本上我需要:

  • byte [3] color< - > 1字节状态和颜色
  • int minutes< - >字节[2] 分钟

我会感谢任何帮助

2 个答案:

答案 0 :(得分:0)

我不太确定你的问题是什么,可能会有所帮助:

final byte red = 1; // 01 binary
final byte green = 2; // 10 binary
final byte blue = 3; // 11 binary

final byte finalColor = (byte) ((red & 0x3) << 4) | ((green & 0x3) << 2) | (blue & 0x3);
System.out.println(finalColor);// finalColor is 011011 = 27 decimal

final int minutes = 0x1234; // first byte is 0x12, second byte is 0x34
final byte[] bytes = {(byte) (((minutes) >>> 8) & 0xff), (byte) (minutes & 0xff)};

System.out.println(bytes[0]); // 0x12 = 18 decimal
System.out.println(bytes[1]); // 0x34 = 52 decimal

答案 1 :(得分:0)

我不确定第二个问题是什么。所以我做了这两个可能对你有用的功能:

public static int convertToInt(int a, int b, int c, int d) {
    a = Math.min(a, 255);
    b = Math.min(b, 255);
    c = Math.min(c, 255);
    d = Math.min(d, 255);

    return ((a & 0xFF) << 24) | ((b & 0xFF) << 16) | ((c & 0xFF) << 8) | (d & 0xFF);
}

public static int[] extractComponents(int data) {
    int a = (data >> 24) & 0xFF;
    int b = (data >> 16) & 0xFF;
    int c = (data >> 8) & 0xFF;
    int d = data & 0xFF;

    return new int[] {a, b, c, d};
}

convertToInt函数需要四个数字(小于255)并将它们全部放在一个int中。

extractComponents功能正好相反。

这是一个例子:

int data = 0xC8E0601B;
int[] dataA = extractComponents(data);
for(int i = 0 ; i < dataA.length; i++) System.out.printf("%x\n", dataA[i]);

System.out.printf("%x\n", convertToInt(dataA[0], dataA[1], dataA[2], dataA[3]));