我有一个函数,通过串口一次读取一个字符,一个字节。收集这些字节后,它们将传递给处理字节和消息的方法。
我知道如何解决问题(修复方法如下),但为什么在不执行修复时我的字节会被截断?
unsigned char dpBuf[255];
...
// Pretend dpBuf has values 0x01 0x02 0x03 0x00 0x00 0x00 0x04 0x05
..
ProcessMsg(dpBuf);
..
void ProcessMsg(unsigned char *buff)
{
// buff comes in as 0x01 0x02 0x03 0x00 and rest is truncated
char p[255];
...
for (int i = 0; i < sizeof(buff); i++)
{
sprintf(p, " 0x%X ", (unsigned char)b[i]);
}
..
}
修正:
ProcessMsg((unsigned char*)&dpBuf, length); // instead of sizeof() in the loop, use length
..
void ProcessMsg (unsigned char *buff, int length)
{
// buff comes in as the original character string and is not truncated
..
// do for loop, print out contents
}
答案 0 :(得分:11)
buff
被声明为const char*
,因此sizeof(buff)
返回此类指针的大小,这在您的计算机上似乎是4个字节。因此,缓冲区的前四个字节然后在循环中打印。
将dpBuf
声明为更大的数组并不重要,因为它作为指针传递给函数。要避免此问题,您应该向函数添加一个参数,其中显式传递缓冲区的大小。
答案 1 :(得分:3)
buff是一个指针,因此它的大小为4。 sizeof(buff)= 4 sizeof(dpBuf)= 255
你想要第二个。
答案 2 :(得分:2)
正如大家所说,在C ++中,以null结尾的char数组被称为字符串。存储字符的缓冲区大小可以大于这些术语中的“字符串长度”。例如:
char inBuf [] = {0x01, 0x02, 0x03, 0x00, 0x00, 0x04, 0x05};
size_t bufSize = sizeof(inBuf);
size_t rawLen = strlen(inBuf);
...在这种情况下,inBuf的大小为7,但strlen()返回3.
使用ASCII,您无法在字符串中嵌入NULL。但是,如果要嵌入NULL,则可以使用std :: string。 std :: string一般都很有用,所以请查看。完整的工作示例:
#include <cstdlib>
#include <string>
#include <iostream>
using namespace std;
char inBuf [] = {0x01, 0x02, 0x03, 0x00, 0x00, 0x04, 0x05};
int main()
{
size_t bufSize = sizeof(inBuf);
size_t rawLen = strlen(inBuf);
string ss(inBuf, sizeof(inBuf));
size_t ssLen = ss.length();
cout << "Buffer Size = " << bufSize << ", Raw string length = " << rawLen << ", std::string length = " << ssLen;
return 0;
}
程序输出为:
缓冲区大小= 7,原始字符串长度= 3,std :: string length = 7
答案 3 :(得分:1)
您的代码错误:for (int i = 0; i < sizeof(buff); i++)
它使用sizeof
,实际上相当于调用sizeof(unsigned char*)
。你必须明确地通过这个长度。
答案 4 :(得分:1)
sizeof(buff)要求指针的大小 - 可能是4
答案 5 :(得分:1)
Sizeof(buff)返回const char *的大小,因为这是buff的类型。我认为您正在寻找的方法是strlen(buff),但即使这样,strlen也会在找到null终止符时停止。 http://www.cplusplus.com/reference/clibrary/cstring/strlen/
在标准ascii中,0x00被认为是一个空终止符,通常被认为是c样式字符串的结尾。
我可能会建议您查看使用stl字符串 http://www.cplusplus.com/reference/string/string/