Conversión de arreglo de bytes a cadena de texto.
Estoy haciendo una aplicación de Android que se comunica con un dispositivo bluetooth. Estoy escribiendo un mensaje específico en la característica seleccionada de la siguiente manera:
byte[] clearDataset = new byte [0x0A];
Log.d("uploadDataset", "Mensaje: " + Converters.byteArrayToHexString(clearDataset, 0, clearDataset.length));
writeCharacteristic(Converters.byteArrayToHexString(clearDataset, 0, clearDataset.length), Constants.DIAG_WRITE);
Mi función de conversión luce así:
public static String byteArrayToHexString(byte[] bytes, int startingByte , int endingByte) {
byte[] shortenBytes = Arrays.copyOfRange(bytes, startingByte, endingByte);
final byte[] HEX_ARRAY = "0123456789ABCDEF".getBytes(StandardCharsets.US_ASCII);
byte[] hexChars = new byte[shortenBytes.length * 2];
for (int j = 0; j < shortenBytes.length; j++) {
int v = shortenBytes[j] & 0xFF;
hexChars[j * 2] = HEX_ARRAY[v >>> 4];
hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
}
StringBuilder output = new StringBuilder();
for (int i = 0; i < new String(hexChars, StandardCharsets.UTF_8).length(); i += 2) {
String str = new String(hexChars, StandardCharsets.UTF_8).substring(i, i + 2);
output.append((char) Integer.parseInt(str, 16));
}
return output.toString();
}
Estoy tratando de entender por qué en este caso la salida de mi conversión se ve así:
D/uploadDataset: Mensaje: ��������������������
Es extraño, porque la misma función de conversión funciona perfectamente bien cuando la uso para traducir los valores que recibo como notificaciones bluetooth. Cualquier sugerencia sobre dónde puede estar el problema es bienvenida.
davy.ai
Posibles razones para la salida de conversión extraña
Podría haber varias razones para la salida de conversión extraña en este caso. Aquí hay algunas posibles:
byteArrayToHexString
al llamarla en el métodowriteCharacteristic
. Esto podría resultar en copiar la parte incorrecta del arreglo de bytes, dando lugar a una salida incorrecta.Es posible que la clase
Converters
no esté implementada correctamente, lo que podría llevar a una salida incorrecta. Es posible que la misma función de conversión funcione bien al recibir valores como una notificación Bluetooth, pero no al enviar un mensaje a una característica elegida.Es posible que el método
writeCharacteristic
esté implementado incorrectamente, lo que podría llevar a una salida incorrecta. Es posible que el mensaje no se esté enviando correctamente a la característica elegida, dando lugar a una salida extraña.Pasos adicionales para solucionar el problema
Para solucionar el problema de manera adicional, se podrían realizar los siguientes pasos:
Verificar nuevamente los valores de startingByte y endingByte pasados a la función
byteArrayToHexString
al llamarla en el métodowriteCharacteristic
. Asegurarse de que sean los valores correctos para la parte del arreglo de bytes que necesita ser convertida.Revisar la clase
Converters
en busca de cualquier error o fallo que pueda estar causando la salida extraña. Verificar nuevamente todos los métodos de conversión en la clase para asegurarse de que estén implementados correctamente.Revisar el método
writeCharacteristic
en busca de cualquier error o fallo que pueda estar causando la salida extraña. Asegurarse de que el mensaje se esté enviando correctamente a la característica elegida.Intentar utilizar un método de conversión diferente para convertir el arreglo de bytes en una cadena, y ver si eso funciona mejor. Por ejemplo, se podría utilizar el método
Hex.encodeHexString
de la bibliotecacommons-codec
.Utilizar herramientas de depuración como puntos de interrupción y registros para acotar el problema y ver de dónde podría provenir. Esto podría ayudar a identificar la causa raíz de la salida extraña.