unsigned char 类型数组怎么求长度阿!?

DestinyHot 2011-08-14 02:22:20
我定义了一个unsigned char 类型数组,同时又定义了一个二维数组,通过数组指针的改变取值

unsigned char buff[256];
unsigned char (*p)[6];
unsigned char SYNC[4][6]={{sync1,sync2,3,0,0,0},{sync1,sync2,3,1,0,1},{sync1,sync2,3,2,0,2},{sync1,sync2,3,1,0,1}};
p=SYNC;

但是我需要求出二维数组每一行的数据长度

for(i=0;i<4;i++)
{
len=strlen((char *)(p+i));
printf("read len is %d\n",len);
memcpy(buff,(p+i),len);
buff[len]='\0';

可是我发先strlen只能用char *类型,我就进行强制转换,可得到的结果len第一次是3,后3次是4,可我数组中定义的是6个字节的数据阿?!
为什么会这样!?应该怎么正确求出 unsigned char 数组的数据长度?
还有有没有什么方法能一次性将数组中一行的数据全部输出阿?我发现只有数据是字符的时候貌似可以通过数组行首地址%s一次全部输出,我存的是整型数,貌似输出不了,
有什么办法嘛,希望一并解答!
...全文
3404 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljhhh0123 2011-08-14
  • 打赏
  • 举报
回复 1
你都定好长度了,还求什么长度?
这就相当于你定义了一个int整数组,你用strlen函数求过长度吗?
strlen不是干这个用的。
Soul_7 2011-08-14
  • 打赏
  • 举报
回复

for(i=0;i<4;i++)
{
int len=sizeof(SYNC[i])/sizeof(char);

printf("%d\n",len);
}
???????
Soul_7 2011-08-14
  • 打赏
  • 举报
回复
c/c++ code
a
Alexander 2011-08-14
  • 打赏
  • 举报
回复
求矩阵每行列数问题:

for(i=0;i<4;i++)
{
int len=sizeof(SYNC[i])/sizeof(char);

printf("%d\n",len);
}
jackyjkchen 2011-08-14
  • 打赏
  • 举报
回复
搞了半天原来是乱码问题啊,是这样的,250、1这样的本身就不是标准ascii的可打印字符(0~127是标准ascii),显示乱码是正常的。

你想显示明文,两种方法,二进制传输,解析的时候用格式化字符串,或者说直接用fprintf格式化io
DestinyHot 2011-08-14
  • 打赏
  • 举报
回复
比如说,目标机只识别(250.251.1.1.1.1)这样一串数据,我想将数据通过write写进串口,目标机再从串口读出识别,就像上面我写的代码,直接write数组内容是正确的嘛?我的本意只是如果指令是长度是可变的,我喜欢能每次都求出长度,但参数填到函数中,这样的话有什么地方是不对的嘛?

我在实现的时候出现的几个问题就是上面说的!长度求的不对,你也回答了,strlen是通过‘\0’结尾识别
我也试过转不转类型求出的size是一样的,不知到为什么上面的缺是错的!

还有我想测试write的数据是否是对的时候,发现对方接受的是乱码,而又不想用for循环一个一个%d输出,就问下能不能通过首地址一次性将数据输出!

帮忙解答下
jackyjkchen 2011-08-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 destinyhot 的回复:]

引用 8 楼 jackyjkchen 的回复:

楼主好像还是没有明白,谁说254不能用char存储?254就是0xFE,内存中存的就是0xFE,你用unsigned char表示就是254,相当于char表示的-2。

如果我发送给目标机 char 0xFE,他是接受-2,还是254?

如果可以的话,我是想问下你说的size是如何使用的!还有如果存的是二进制数据,能不能将数组中的……
[/Quote]

我管他接受的是-2还是254,有区别么,不过就是OxFE的两种外在形式而已,请记住,你传的就是0xFE,接收方愿意解释成什么我管不着。

所谓的size,就是你的数据大小啊,你的真正数据多大,size就多大。

你用的write到底是什么?首先得保证write不是那种只能处理字符串的函数,如果是文件IO,也得保证是二进制方式打开的文件。
DestinyHot 2011-08-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jackyjkchen 的回复:]

楼主好像还是没有明白,谁说254不能用char存储?254就是0xFE,内存中存的就是0xFE,你用unsigned char表示就是254,相当于char表示的-2。
[/Quote]
如果我发送给目标机 char 0xFE,他是接受-2,还是254?

如果可以的话,我是想问下你说的size是如何使用的!还有如果存的是二进制数据,能不能将数组中的数据通过首地址一次性输出?
jackyjkchen 2011-08-14
  • 打赏
  • 举报
回复
楼主好像还是没有明白,谁说254不能用char存储?254就是0xFE,内存中存的就是0xFE,你用unsigned char表示就是254,相当于char表示的-2。

DestinyHot 2011-08-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jackyjkchen 的回复:]

别老问能不能,你就当char和unsigned char没区别就行了,完全取决于你存储的到底是什么数据,char一样可以存储二进制数据。

有些函数只能处理字符串,会在\0处截断。

学C最重要的一点就是要抛开高级语言的表象,搞清楚内存里是什么东西。
[/Quote]

我要存的数据有254,char表示不到吧! 我先在就是想把这个数组中的数据一次性用write写出去,在写write需要个长度,我就以为能用strlen,但是得不到实际的长度!

len=strlen(*(p+i));
printf("read len is %d\n",len);
memcpy(buff,(p+i),6);
buff[len]='\0';
write(fd,buff,len);
DestinyHot 2011-08-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lvjing_csdn 的回复:]

不知道你说的数据长度具体指什么,strlen求的是一个0之前的数字个数。还有就是你再用strlen的时候最好还是不强制转换,对p+i解引用一次就可以了,即len=strlen(*(p+i));
[/Quote]
但是就算改成 strlen(*(p+i)),输出的长度还是不符阿,我是6个字节的数据,len的到的是3,4,4,4
因为我的数据不是定长的 这四个是6个字节的,别的是8个字节的,所以我想通过求出字节长度,在调用write函数的时候可以直接当参数填进去!
jackyjkchen 2011-08-14
  • 打赏
  • 举报
回复
C语言的特点就是,哪怕你用int型甚至float,一样可以存储字符串,一样可以存储任意数据,别把类型之间的差别看的太大,本质上没有区别
jackyjkchen 2011-08-14
  • 打赏
  • 举报
回复
别老问能不能,你就当char和unsigned char没区别就行了,完全取决于你存储的到底是什么数据,char一样可以存储二进制数据。

有些函数只能处理字符串,会在\0处截断。

学C最重要的一点就是要抛开高级语言的表象,搞清楚内存里是什么东西。
lvjing_CSDN 2011-08-14
  • 打赏
  • 举报
回复
不知道你说的数据长度具体指什么,strlen求的是一个0之前的数字个数。还有就是你再用strlen的时候最好还是不强制转换,对p+i解引用一次就可以了,即len=strlen(*(p+i));
DestinyHot 2011-08-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jackyjkchen 的回复:]
如果不是(如二进制数据),那么,存储的时候就需要同时保存数据长度信息。

你看各种协议,如tcp、udp等,都会在协议头部保存数据区的大小,就是这个原因。

一般函数的参数如果用个了unsigned char*一般也意味着会传二进制数据,往往这类函数还会……
[/Quote]
就比如说我上面的是规定6个字节的数据,我自己知道就行,在memcpy的时候直接填入数据长度6就行了吧!
但是我还要使用一个write(fd,buff,len),len也直接改成6?为什么我的另外一个终端下接收到的数据是乱码,是因为在unsigned char数组下二进制数据不能一次输出嘛?就像我上面问得,在unsigned char数组下能不能像字符串一样%s将整型数据一起打印出来!我的write函数是不是可以将数据整体一起写入文件的?
jackyjkchen 2011-08-14
  • 打赏
  • 举报
回复
不论是unsigned char还是char,内存中没有区别,能不能用strlen取决于你存储的是不是以\0结尾的C风格字符串。

如果不是(如二进制数据),那么,存储的时候就需要同时保存数据长度信息。

你看各种协议,如tcp、udp等,都会在协议头部保存数据区的大小,就是这个原因。

一般函数的参数如果用个了unsigned char*一般也意味着会传二进制数据,往往这类函数还会有个size参数

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧