我有16位。我可以在每一位中设置一些属性,并将其发送到COM端口(财务打印机)。
例如:如果选中0位,则在选中时显示徽标。

我需要将此16位转换为4个字节并发送到COM端口。
例如:如果选中0位,则4个字节将是0x30、0x31、0x30、0x30。
我通过COM端口监视API得到的字节结果。

我必须怎么做才能从16位中获得4个字节?

其他例子:

  • 1位已检查-0x30、0x32、0x30、0x30
  • 2位已检查-0x30、0x34、0x30、0x30
  • 0和2位已检查-0x30、0x35、0x30、0x30
  • 0和9位已检查-0x30、0x31、0x30、0x32
  • 0、1、2、3、4、5、9位已检查-0x33、0x46、0x30、0x32
  • 最佳答案

    请注意,ASCII中0x30 ='0'。在我看来,您正在以十六进制的两个字节的形式传输16位,首先传输0-7位,然后传输8-15位,即您要传输

  • 4-7位的十六进制数字
  • 0-3位的十六进制数字
  • 12-15位的十六进制数字
  • 位8-11的十六进制数字

  • 我们需要更多的数据点来确定,但这适合您上面的示例:
    bit 0 set encodes to string "0100" = 0x30 0x31 0x30 0x30
    bit 1 set                   "0200" = 0x30 0x32 0x30 0x30
    bit 2 set                   "0400" = 0x30 0x34 0x30 0x30
    0+2                         "0500" = 0x30 0x30 0x30 0x30
    0+9                         "0102" = 0x30 0x31 0x30 0x32
    0,1,2,3,4,5,9               "3F02" = 0x33 0x46 0x30 0x32
    

    即在Java中,如果您将比特放在单个整数n中,则可能需要
    String output = Integer.toHexString((n >> 4) & 0xf)
                  + Integer.toHexString(n & 0xf)
                  + Integer.toHexString((n >> 12) & 0xf)
                  + Integer.toHexString((n >> 8) & 0xf);
    byte[] data = output.toUpperCase().getBytes("ASCII");
    

    通过字符串,或
    byte[] data = new byte[4];
    data[0] = (byte)((n >> 4) & 0xf);
    data[1] = (byte)(n & 0xf);
    data[2] = (byte)((n >> 12) & 0xf);
    data[3] = (byte)((n >> 8) & 0xf);
    for(int i = 0; i < 4; ++i) {
        data[i] += (data[i] < 10) ? '0' : ('A' - 10);
    }
    

    避免字符串。

    要将四个字节解析回单个int,可以使用
    int bits = (((data[0] & 0xf) + ((data[0] >= 'A') ? 9 : 0)) << 4)
               | ((data[1] & 0xf) + ((data[1] >= 'A') ? 9 : 0))
               | (((data[2] & 0xf) + ((data[2] >= 'A') ? 9 : 0)) << 12)
               | (((data[3] & 0xf) + ((data[3] >= 'A') ? 9 : 0)) << 8);
    

    显然这里没有输入检查-我假设我们以预期的格式获取输入。方括号中的主要位应仅解析字符串中的单个十六进制数字-如果需要,您可以对其进行重构或实现更强大的功能。

    关于java - 从16位创建4个字节,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10025358/

    10-10 13:47