从 Arduino 中的函数返回一个初始长度未知的字符数组
Returning a char array of initially unknown length from a function in Arduino
我需要将 json 发送到服务器。该代码工作完美,但因为我需要在两个位置调用它,因此想要使用它来实现我们的功能。但是,我无法让它与 char 数组一起使用。一种可能性是将 char 数组转换为我期望的 String,但这不是我期望的内存效率。所以我想我会传递一个指针,在函数中分配大小,然后 return 长度。但它似乎没有用,'encoded' char* 似乎是空的。
这可能是我做错的基本问题。
这是代码:
Serial.println("Connected");
char* encoded;
int contentLength = generateData(encoded);
Serial.print("Data to be send, length: "); Serial.print(contentLength); Serial.println(" Data: "); Serial.println(encoded);
// Send request to the server:
client.println("POST /api/heartbeat HTTP/1.1");
client.println("Host: localhost");
client.println("Accept: */*");
client.println("Content-Type: application/x-www-form-urlencoded");
client.print("Content-Length: ");
client.println(contentLength + 5);
client.println();
client.print("data=");
client.print(encoded);
// Done here, as the response availability sometimes takes time.
lastConnection = millis();
updateServer = false;
free(encoded);
和函数:
int generateData(char* encoded) {
Serial.println("Preparing the data to be send....");
String inputString = "{\"status\":\"OK\",\"hostname\":\"";
inputString += hostname;
inputString += "\",\"build\":";
inputString += build;
inputString += ",\"hardware\":\"";
inputString += hardware;
inputString += "\",\"sensors\":[";
bool firstSensor = true;
for (uint8_t i = 0; i < 8; i++) {
if (temperatureValues[i] == 0) continue;
if (!firstSensor) inputString += ",";
inputString += "{\"sensor\":\"";
inputString += temperatureAddresses[i];
inputString += "\",\"value\":";
inputString += String(temperatureValues[i]);
inputString += ",\"type\":\"temp\"}";
firstSensor = false;
}
inputString += "]";
if (pendingResponses.length() > 0) {
inputString += ",\"responses\":[";
inputString += pendingResponses;
inputString += "]";
pendingResponses = "";
}
inputString += "}";
byte plain[inputString.length() + 1];
inputString.getBytes(plain, inputString.length() + 1);
des.calc_size_n_pad(sizeof(plain));
byte encodedByte[des.get_size()];
byte plain_p[des.get_size()];
des.padPlaintext(plain, plain_p);
for (int i = 0; i < (des.get_size() / 8); i++) {
byte intermitInput[8];
byte intermitResult[8];
for (int j = 0; j < 8; j++) {
intermitInput[j] = plain_p[(i * 8) + j];
}
des.encrypt(intermitResult, intermitInput, (byte*)key);
for (int j = 0; j < 8; j++) {
encodedByte[(i * 8) + j] = intermitResult[j];
}
}
int inputLength = sizeof(encodedByte);
int newLength = Base64.encodedLength(inputLength);
encoded = (char*) malloc(newLength + 1);
encoded[newLength] = '[=11=]';
// Base64 Encoder
Base64.encode(encoded, (char*)encodedByte, inputLength);
return newLength;
}
您正在按值encoded
传递
char* encoded;
int contentLength = generateData(encoded);
这意味着当你在 generateData()
中分配它时
encoded = (char*) malloc(newLength + 1);
encoded[newLength] = '[=11=]';
您只更改了一个局部变量。
最快的解决方法是更改 generateData()
以通过引用而不是值获取其参数,它应该可以工作
int generateData(char* &encoded)
杰克的想法应该可行。
但另一个想法是制作一个包含 char *
和 int
(或 size_t
)和 return 的结构。那么你不需要通过指针或引用参数尝试“return”任何东西。
我需要将 json 发送到服务器。该代码工作完美,但因为我需要在两个位置调用它,因此想要使用它来实现我们的功能。但是,我无法让它与 char 数组一起使用。一种可能性是将 char 数组转换为我期望的 String,但这不是我期望的内存效率。所以我想我会传递一个指针,在函数中分配大小,然后 return 长度。但它似乎没有用,'encoded' char* 似乎是空的。
这可能是我做错的基本问题。
这是代码:
Serial.println("Connected");
char* encoded;
int contentLength = generateData(encoded);
Serial.print("Data to be send, length: "); Serial.print(contentLength); Serial.println(" Data: "); Serial.println(encoded);
// Send request to the server:
client.println("POST /api/heartbeat HTTP/1.1");
client.println("Host: localhost");
client.println("Accept: */*");
client.println("Content-Type: application/x-www-form-urlencoded");
client.print("Content-Length: ");
client.println(contentLength + 5);
client.println();
client.print("data=");
client.print(encoded);
// Done here, as the response availability sometimes takes time.
lastConnection = millis();
updateServer = false;
free(encoded);
和函数:
int generateData(char* encoded) {
Serial.println("Preparing the data to be send....");
String inputString = "{\"status\":\"OK\",\"hostname\":\"";
inputString += hostname;
inputString += "\",\"build\":";
inputString += build;
inputString += ",\"hardware\":\"";
inputString += hardware;
inputString += "\",\"sensors\":[";
bool firstSensor = true;
for (uint8_t i = 0; i < 8; i++) {
if (temperatureValues[i] == 0) continue;
if (!firstSensor) inputString += ",";
inputString += "{\"sensor\":\"";
inputString += temperatureAddresses[i];
inputString += "\",\"value\":";
inputString += String(temperatureValues[i]);
inputString += ",\"type\":\"temp\"}";
firstSensor = false;
}
inputString += "]";
if (pendingResponses.length() > 0) {
inputString += ",\"responses\":[";
inputString += pendingResponses;
inputString += "]";
pendingResponses = "";
}
inputString += "}";
byte plain[inputString.length() + 1];
inputString.getBytes(plain, inputString.length() + 1);
des.calc_size_n_pad(sizeof(plain));
byte encodedByte[des.get_size()];
byte plain_p[des.get_size()];
des.padPlaintext(plain, plain_p);
for (int i = 0; i < (des.get_size() / 8); i++) {
byte intermitInput[8];
byte intermitResult[8];
for (int j = 0; j < 8; j++) {
intermitInput[j] = plain_p[(i * 8) + j];
}
des.encrypt(intermitResult, intermitInput, (byte*)key);
for (int j = 0; j < 8; j++) {
encodedByte[(i * 8) + j] = intermitResult[j];
}
}
int inputLength = sizeof(encodedByte);
int newLength = Base64.encodedLength(inputLength);
encoded = (char*) malloc(newLength + 1);
encoded[newLength] = '[=11=]';
// Base64 Encoder
Base64.encode(encoded, (char*)encodedByte, inputLength);
return newLength;
}
您正在按值encoded
传递
char* encoded;
int contentLength = generateData(encoded);
这意味着当你在 generateData()
encoded = (char*) malloc(newLength + 1);
encoded[newLength] = '[=11=]';
您只更改了一个局部变量。
最快的解决方法是更改 generateData()
以通过引用而不是值获取其参数,它应该可以工作
int generateData(char* &encoded)
杰克的想法应该可行。
但另一个想法是制作一个包含 char *
和 int
(或 size_t
)和 return 的结构。那么你不需要通过指针或引用参数尝试“return”任何东西。