gpt4 book ai didi

java - 从 16 位创建 4 个字节

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:34:14 24 4
gpt4 key购买 nike

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

我需要将这 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com