Как преобразовать строку в массив байтов
У меня есть код, его цель-получить строку от такого компорта, как:
Установите@1234567890123456@1234567890123456@1234567890123456@1234567890123456
@ 1234567890123456 и преобразуйте его в четыре байтовых массива байт user1[16], user2[16], pass1[16], pass2[16]
. Вот код:
String inString = ""; // COM port incoming data buffer
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println("Start");
}
void loop() {
// put your main code here, to run repeatedly:
// Receive data from com port
while (Serial.available() > 0) {
int inChar = Serial.read();
if (inChar != '\n') {
inString += (char)inChar;
} else {
// New line
String Action = inString.substring(0, 3);
if (Action == "Set") {
SetCard(inString);
} else if (Action == "Get") {
Serial.println("1");
} else {
Serial.println(Action);
}
inString = "";
}
}
}
void SetCard(String Data) {
Serial.println(Data);
// Data Set@user1@user2@pass1@pass2
// Set@1234567890123456@1234567890123456@1234567890123456@1234567890123456
byte user1[16], user2[16], pass1[16], pass2[16];
String user1str = inString.substring(4, 20);
String user2str = inString.substring(21, 37);
String pass1str = inString.substring(38, 54);
String pass2str = inString.substring(55, 71);
Serial.println("Strings");
Serial.println(user1str);
Serial.println(user2str);
Serial.println(pass1str);
Serial.println(pass2str);
Serial.println("Arrays");
user1str.getBytes(user1, 16);
user2str.getBytes(user2, 16);
pass1str.getBytes(pass1, 16);
pass2str.getBytes(pass2, 16);
writeByteArray(user1, 16);
writeByteArray(user2, 16);
writeByteArray(pass1, 16);
writeByteArray(pass2, 16);
}
void writeByteArray(byte array[], int arrlength)
{
for (int j = 0 ; j < arrlength ; j++) //print the block contents
{
Serial.write (array[j]);//Serial.write() transmits the ASCII numbers as human readable characters to serial monitor
}
Serial.println("");
}
Когда я запускаю этот код и отправляю свою строку через com-порт, я ожидаю вывода:
Start
Set@1234567890123456@1234567890123456@1234567890123456@1234567890123456
Strings
1234567890123456
1234567890123456
1234567890123456
1234567890123456
Arrays
1234567890123456
1234567890123456
1234567890123456
1234567890123456
И все же я получаю
Start
Set@1234567890123456@1234567890123456@1234567890123456@1234567890123456
Strings
1234567890123456
1234567890123456
1234567890123456
1234567890123456
Arrays
123456789012345
123456789012345
123456789012345
123456789012345
Почему? И как мне получить желаемый результат? Документы getBytes
@rfg, 👍0
2 ответа
Лучший ответ:
Почему? И как мне получить желаемый результат? Документы getBytes
Функция-член строки getBytes() завершит строку с нулевым значением. Для этого вы должны добавить место.
byte user1[17], user2[17], pass1[17], pass2[17];
...
user1str.getBytes(user1, sizeof(user1));
...
Serial.print((char*) user1);
Это должно сработать.
Используя String.getBytes(буфер, len) для получения байтов.
"len" - это длина для копирования, но обычно нужно добавить 1 для конца строки '\0'.
Например:
String s = "123";
int count = s.length(); // lenth() is 3
s.getBytes(buffer, count); // copied "12\0" => HEX(31 32 00)
s.getBytes(buffer, count + 1); // copied "123\0" => HEX(31 32 33 00)
В официальном документе не упоминалось выше, и это нецелесообразно для современного дизайна функций.
Непонимание в этом и так много тратит нашу жизнь впустую.
toCharArray() задокументирован https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/tochararray, @Juraj
toCharArray(буфер, len) все равно сохранит последнее прощание для 0x00 ('\0'). Поэтому, если вы хотите скопировать определенную длину содержимого, len должен добавить 1 для "0". Кроме того, следите за длиной буфера как за последним чертовым байтом., @Tomex Ou
это то, что ожидается для массива символов (строка C) (но не ожидается для getBytes), @Juraj
Если в официальном документе подробно упоминается "\0", это хорошо для цели. Ни к кому не жалко., @Tomex Ou
Мне трудно читать ваш пост и комментарии. Как вы объявляете "буфер"?, @scopchanov
- Назначение и управление цифровым выводом из строки
- Очень простая операция Arduino Uno Serial.readString()
- Проблемы с преобразованием byte[] в String
- Преобразование строки в IP-адрес
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Понимание того, почему следует избегать «String» и альтернативных решений
- Arduino: как записать значение переменной в текстовый файл и изменить его на SD-карте?
- Буфер char в String в Arduino UNO
Спасибо. Это сработало. Итак, как я могу обрезать массив
user1[17]
доuser1[16]
после того, как я задал его значение с помощью getBytes?, @rfgИли мне нужно создать буферный массив[17], а затем записать оттуда первые 16 элементов в массив[16]?, @rfg
Если подумать, я мог бы просто
`для (int j = 0 ; j < sizeof(пользователь1) ; j++) { пользователь1[j] = пользователь1стр.чарат(j); }
` и это будет работать с 16 элементами, @rfg