无符号字符数组如何转换成字符串

didijiji 2012-10-29 09:23:42
例如:有一个unsigned char nc[6] = {'a','b','c','d','e','f'};
String s = "";

如何使得nc转换成 s = "abcdef";字符串呢?
...全文
712 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccrun.com 2012-10-29
  • 打赏
  • 举报
回复
1. 建议在IOHandler->ReadByte以前先调用IOHandler->CheckForDataOnSource(x),然后判断IOHandler->InputBufferIsEmpty()看是否有数据。

2. 三楼说的是有道理的。建议楼主,如果要接收6个字节的数据,就创建一个大小为7个字节的缓冲区并清零。
didijiji 2012-10-29
  • 打赏
  • 举报
回复
妖哥,有这样一个问题:
就是我这段用idtcpserver做服务器端,客户端使用java做的,我用的是indy 10.1.6版本,我在处理java客户端发送过来的数据时。


void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
{
a++;

unsigned char c[6];
unsigned char c1[16];

for (int i = 0; i < 6; i++)
{
断点处: c[i] = AContext->Connection->IOHandler->ReadByte();
}

String str = (char*)c;


for(int j = 0; j <16; j++)
{
c1[j] = AContext->Connection->IOHandler->ReadByte();
}

String final = (char*)c1;

if(str == "XXXCID")
{
ListBox2->Items->Add(str + final);
TByteDynArray buf;
unsigned char msg[] = "XXXCID\x3e\x02\x01\x01\x01\x02\x01\x03\x02\x04\x01\x05\x02\x06\x01\x07\x01\x08\x01";
buf = RawToBytes(static_cast<void*>(msg),sizeof(msg)-1);
AContext->Connection->IOHandler->Write(buf);
}
}

[Quote=引用 1 楼 的回复:]

C/C++ code
unsigned char nc[6] = {'a','b','c','d','e','f'};
String s = (char *)nc;
[/Quote]

我通过抓包工具能抓到客户端发送过来的数据包,但是我设置了一个断点在那里,单步执行的时候根本之星不过去,程序就卡在c[i] = AContext->Connection->IOHandler->ReadByte();这条语句了,怎么回事儿?
bigfog 2012-10-29
  • 打赏
  • 举报
回复
unsigned char nc[6] = {'a','b','c','d','e','f'};
String s = (char *)nc;
感觉有越界风险,最好最后加个'\0'结束字符
xjq2003 2012-10-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
C/C++ code

unsigned char nc[6] = {'a','b','c','d','e','f'};
String s = (char *)nc;
[/Quote]
妖哥出手,问题没有!!!
ccrun.com 2012-10-29
  • 打赏
  • 举报
回复
unsigned char nc[6] = {'a','b','c','d','e','f'};
String s = (char *)nc;
didijiji 2012-10-29
  • 打赏
  • 举报
回复
我这个好像是在同一个客户端(IP地址不变的客户端)向服务器发起多个连接是出现的(IP不变,变换端口号与服务器在同一个时刻保持着多个连接),好像有时候多连几个就报异常了,还有的时候是点击停止服务器按钮的时候汇报异常,有时候报的异常又是“Disconnected”异常。
[Quote=引用 14 楼 的回复:]

AContext->Connection->IOHandler->ReadTimeout = 10;
这个放在OnExecute事件中没有用处。

你说有时会出现10054的错误,是在什么情况下出现?
[/Quote]
wg961423 2012-10-29
  • 打赏
  • 举报
回复
10毫秒也太短了
ccrun.com 2012-10-29
  • 打赏
  • 举报
回复
AContext->Connection->IOHandler->ReadTimeout = 10;
这个放在OnExecute事件中没有用处。

你说有时会出现10054的错误,是在什么情况下出现?
didijiji 2012-10-29
  • 打赏
  • 举报
回复
恩,谢谢妖哥,不过有时候还会产生这个错误。


还有就是我设置了一个读入延时,不知道那个读入延时在什么情况下用,一般值设置为多少毫秒,谢谢!!!

void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
{
AContext->Connection->IOHandler->CheckForDataOnSource(10);

if(AContext->Connection->IOHandler->InputBufferIsEmpty())
{
return;
}

AContext->Connection->IOHandler->ReadTimeout = 10;
a++;
unsigned char c[7] = {NULL};
unsigned char c1[17] = {NULL};

for (int i = 0; i < 6; i++)
{
c[i] = AContext->Connection->IOHandler->ReadByte();
}

String str = (char*)c;

if(str == "XXXCID")
{
for(int j = 0; j <16; j++)
{
c1[j] = AContext->Connection->IOHandler->ReadByte();
}

String final = (char*)c1;

ListBox2->Items->Add(str + final);
TByteDynArray buf;
unsigned char msg[] = "XXXCID\x3e\x02\x01\x01\x01\x02\x02\x03\x01\x04\x02\x05\x01\x06\x02\x07\x01\x08\x02";
buf = RawToBytes(static_cast<void*>(msg),sizeof(msg)-1);
AContext->Connection->IOHandler->Write(buf);
aa++;
}
}

[Quote=引用 12 楼 的回复:]

例程已看到,我的C++Builder6只有自带的Indy版本,所以无法编译。

就代码来看,建议你将OnExecute事件中的代码改成:

C/C++ code
void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
{
AContext->Connection->IOHandler->CheckFor……
[/Quote]
ccrun.com 2012-10-29
  • 打赏
  • 举报
回复
例程已看到,我的C++Builder6只有自带的Indy版本,所以无法编译。

就代码来看,建议你将OnExecute事件中的代码改成:

void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
{
AContext->Connection->IOHandler->CheckForDataOnSource(10);

// 如果输入缓冲为空就返回
if (AContext->Connection->IOHandler->InputBufferIsEmpty()) return;

a++;
...
}
didijiji 2012-10-29
  • 打赏
  • 举报
回复
实例工程已发送至妖哥邮箱,谢谢!
[Quote=引用 9 楼 的回复:]

不能吧,你弄个简单的demo工程发给我看看。cbfans at 163 dot com
[/Quote]
didijiji 2012-10-29
  • 打赏
  • 举报
回复
不好意思,妖哥,忘了说明一点了,我这个是长连接的,我收到客户端的请求,回复对应的数据给它,但是此时连接是不断开的哦。
[Quote=引用 9 楼 的回复:]

不能吧,你弄个简单的demo工程发给我看看。cbfans at 163 dot com
[/Quote]
ccrun.com 2012-10-29
  • 打赏
  • 举报
回复
不能吧,你弄个简单的demo工程发给我看看。cbfans at 163 dot com
didijiji 2012-10-29
  • 打赏
  • 举报
回复
恩,对的,妖哥,就是IdTCPServer1Connect事件,我发现进入一次IdTCPServer1Connect事件会触发两次IdTCPServer1Execute事件啊,我在函数内部分别设置了一个变量,然后用了一个定时器把变量的值输出到text文本框中,为什么会触发两次呢?

[Quote=引用 7 楼 的回复:]
connect之后也会触发一次?你是不是搞错了,弄成OnConnect事件?
[/Quote]
ccrun.com 2012-10-29
  • 打赏
  • 举报
回复
connect之后也会触发一次?你是不是搞错了,弄成OnConnect事件?
didijiji 2012-10-29
  • 打赏
  • 举报
回复
我现在发现客户端发一次数据过来,会触发两次IdTCPServer1Execute事件,我想问的是:IdTCPServer1Execute事件在什么情况下才被出发啊。
1、在一次connect之后触发一次IdTCPServer1Execute事件。
2、服务器端收到一个TCP数据包就触发一次IdTCPServer1Execute事件。
3、服务器端收到一个带有数据部分的数据包就触发一次IdTCPServer1Execute事件。

我在网上找了一些资料,貌似都没有明确的说明这个问题,都说的含糊其辞的。
[Quote=引用 5 楼 的回复:]

1. 建议在IOHandler->ReadByte以前先调用IOHandler->CheckForDataOnSource(x),然后判断IOHandler->InputBufferIsEmpty()看是否有数据。

2. 三楼说的是有道理的。建议楼主,如果要接收6个字节的数据,就创建一个大小为7个字节的缓冲区并清零。
[/Quote]

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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