在 Android 中通过 USB 将 ArrayList<integer>() 发送为 byte[] 格式
Sending ArrayList<integer>() into byte[] format thru USB in Android
我的代码使用 Modbus CRC16 协议,它会生成一个 List<Integer>
,其中包含必须写入 USB 端口的十六进制值。
我正在尝试将这个包含 Integer 对象的 ArrayList 转换为 byte[] 数组,以便我可以通过 USB 写入它。
我尝试使用 IntBuffer
实现,但没有成功。
public static void SendKey(List<Integer> lst, int deviceaddr, int Key)
{
lst.add(deviceaddr & 0xff);
lst.add(6);
lst.add(0);
lst.add(99);
lst.add((Key >> 8) & 0xff);
lst.add(Key & 0xff);
Add_CRC16(lst);
int[] data = toIntArray(lst);
ByteBuffer byteBuffer = ByteBuffer.allocate(data.length * 4);
IntBuffer intBuffer = byteBuffer.asIntBuffer();
byteBuffer.order(ByteOrder.BIG_ENDIAN);
intBuffer.put(data);
byte[] array = byteBuffer.array();
ftDev.write(array, array.length, true);
}
private static void Add_CRC16(List<Integer> Data) {
// Método detector de erros Cyclic Redundancy Check
int SaveLo, SaveHi;
int CRC16Lo = 0xFF;
int CRC16Hi = 0xff;
int CL = 0x1;
int CH = 0xA0;
for (int b : Data) {
CRC16Lo ^= b;
for (int flag = 0; flag < 8; flag++) {
SaveHi = CRC16Hi;
SaveLo = CRC16Lo;
CRC16Hi = CRC16Hi / 2;
CRC16Lo = CRC16Lo / 2;
if ((SaveHi & 0x01) == 0x01)
CRC16Lo |= 0x80;
if ((SaveLo & 0x01) == 0x01) {
CRC16Hi ^= CH;
CRC16Lo ^= CL;
}
}
}
Data.add(CRC16Lo & 0xff);
Data.add(CRC16Hi & 0xff);
}
我应该使用 ByteArrayOutputStream
和 DataOutputStream
吗?
你可以用这个将任何对象转换成字节数组:
ByteArrayOutputStream b = new ByteArrayOutputStream();
ObjectOutputStream o = new ObjectOutputStream(b);
o.writeObject(objectToConvert);
return b.toByteArray();
不完全清楚您期望的输出是什么,但根据您的示例代码,我怀疑您只是想要:
byte[] bytes = new byte[list.size()];
for (int i = 0; i < list.size(); i++) {
bytes[i] = (byte) list.get(i).intValue();
}
我的代码使用 Modbus CRC16 协议,它会生成一个 List<Integer>
,其中包含必须写入 USB 端口的十六进制值。
我正在尝试将这个包含 Integer 对象的 ArrayList 转换为 byte[] 数组,以便我可以通过 USB 写入它。
我尝试使用 IntBuffer
实现,但没有成功。
public static void SendKey(List<Integer> lst, int deviceaddr, int Key)
{
lst.add(deviceaddr & 0xff);
lst.add(6);
lst.add(0);
lst.add(99);
lst.add((Key >> 8) & 0xff);
lst.add(Key & 0xff);
Add_CRC16(lst);
int[] data = toIntArray(lst);
ByteBuffer byteBuffer = ByteBuffer.allocate(data.length * 4);
IntBuffer intBuffer = byteBuffer.asIntBuffer();
byteBuffer.order(ByteOrder.BIG_ENDIAN);
intBuffer.put(data);
byte[] array = byteBuffer.array();
ftDev.write(array, array.length, true);
}
private static void Add_CRC16(List<Integer> Data) {
// Método detector de erros Cyclic Redundancy Check
int SaveLo, SaveHi;
int CRC16Lo = 0xFF;
int CRC16Hi = 0xff;
int CL = 0x1;
int CH = 0xA0;
for (int b : Data) {
CRC16Lo ^= b;
for (int flag = 0; flag < 8; flag++) {
SaveHi = CRC16Hi;
SaveLo = CRC16Lo;
CRC16Hi = CRC16Hi / 2;
CRC16Lo = CRC16Lo / 2;
if ((SaveHi & 0x01) == 0x01)
CRC16Lo |= 0x80;
if ((SaveLo & 0x01) == 0x01) {
CRC16Hi ^= CH;
CRC16Lo ^= CL;
}
}
}
Data.add(CRC16Lo & 0xff);
Data.add(CRC16Hi & 0xff);
}
我应该使用 ByteArrayOutputStream
和 DataOutputStream
吗?
你可以用这个将任何对象转换成字节数组:
ByteArrayOutputStream b = new ByteArrayOutputStream();
ObjectOutputStream o = new ObjectOutputStream(b);
o.writeObject(objectToConvert);
return b.toByteArray();
不完全清楚您期望的输出是什么,但根据您的示例代码,我怀疑您只是想要:
byte[] bytes = new byte[list.size()];
for (int i = 0; i < list.size(); i++) {
bytes[i] = (byte) list.get(i).intValue();
}