取Byte数组里的值怎么这么难呢!

tulipcaicai 2011-08-23 04:48:11
哪题,请看下面代码

Byte* Send_CODE::Send_0000H()
{
short int XOR_L, XOR_H;
Byte sendArry[28];

sendArry[0] = 0xeb;
sendArry[1] = 0x90;
sendArry[2] = 0xeb;
sendArry[3] = 0x90;

for (int i = 4; i < 20; ++i)
{
sendArry[i] = 0xff;
}

sendArry[20] = 0x00;
sendArry[21] = 0x00;

sendArry[22] = 0x00;
sendArry[23] = 0x00;

XOR_L = MainForm->IntXOR16(sendArry,24, 4, 23) >> 16;
XOR_H = MainForm->IntXOR16(sendArry,24, 4, 23) >> 8;

sendArry[24] = XOR_L;
sendArry[25] = XOR_H;

sendArry[26] = 0x03;
sendArry[27] = 0x03;

return sendArry;
}


现在想实现把sendArry里面的串用UDP发送出去,即IdUDPClient->Send(Send_0000H(), TEncoding::Unicode),但是提示各种无符号char to UnicodeString 错误。要怎么转化Byte和UnicodeString啊!
...全文
254 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
BORLANDSUN 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhouzhangkui 的回复:]

发Byte 的数组,何须转成UnicodeString那么麻烦
直接发送TBytes 类型即可
C/C++ code

void __fastcall TForm1::FormShow(TObject *Sender)
{
IdUDPServer1->DefaultPort = 10006;
IdUDPServer1->Active = true ;
}
void __fastca……
[/Quote]
正解。
ccrun.com 2011-08-24
  • 打赏
  • 举报
回复
IntXOR16函数改成这样:
int  IntXOR16(TBytes pCRCBuffer, int nlen,
int BeginOffsetOfCRCBuffer , int EndOffsetOfCRCBuffer)
{
int XOR;
Byte XOR_L, XOR_H;

Byte Buffer[1024];

XOR_L = 0x00;
XOR_H = 0x00;

if (BeginOffsetOfCRCBuffer< 0 || EndOffsetOfCRCBuffer < BeginOffsetOfCRCBuffer)
{
return -1;
}

int i = 0;
for (i = 0; i < nlen; i++)
{
Buffer[i] = pCRCBuffer[i++];
}

for (i = BeginOffsetOfCRCBuffer; i < EndOffsetOfCRCBuffer; i = i + 2)
{
XOR_L = XOR_L ^ Buffer[i];
}

for (i = BeginOffsetOfCRCBuffer + 1; i < EndOffsetOfCRCBuffer; i = i + 2)
{
XOR_H = XOR_H ^ Buffer[i];
}

XOR = XOR_L | XOR_H << 8;

return XOR;
}


公用的纯算法函数,没必要放到Form类中。
tulipcaicai 2011-08-24
  • 打赏
  • 举报
回复
仔细的看了一下大家提供的东东,现在贴一下我的XOR部分和UDP代码,大家多提宝贵意见啊。

int  TMainForm::IntXOR16(Byte* pCRCBuffer, int nlen,
int BeginOffsetOfCRCBuffer , int EndOffsetOfCRCBuffer)
{
Byte* ptr = pCRCBuffer;

int XOR;
Byte XOR_L, XOR_H;

Byte Buffer[1024];

XOR_L = 0x00;
XOR_H = 0x00;

if (BeginOffsetOfCRCBuffer< 0 || EndOffsetOfCRCBuffer < BeginOffsetOfCRCBuffer)
{
return -1;
}

int i = 0;
for (i = 0; i < nlen; i++)
{
Buffer[i] = *ptr++;
}

for (i = BeginOffsetOfCRCBuffer; i < EndOffsetOfCRCBuffer; i = i + 2)
{
XOR_L = XOR_L ^ Buffer[i];
}

for (i = BeginOffsetOfCRCBuffer + 1; i < EndOffsetOfCRCBuffer; i = i + 2)
{
XOR_H = XOR_H ^ Buffer[i];
}

XOR = XOR_L | XOR_H << 8;
return XOR;
}


调用 XOR 代码

void Send_CODE::Send_0000H(Byte sendArry[])
{
short int XOR_L, XOR_H;

sendArry[0] = 0xeb;
sendArry[1] = 0x90;
sendArry[2] = 0xeb;
sendArry[3] = 0x90;

for (int i = 4; i < 20; ++i)
{
sendArry[i] = 0xff;
}

sendArry[20] = 0x00;
sendArry[21] = 0x00;

sendArry[22] = 0x00;
sendArry[23] = 0x00;

XOR_L = MainForm->IntXOR16(sendArry,24, 4, 23) >> 16;
XOR_H = MainForm->IntXOR16(sendArry,24, 4, 23) >> 8;

sendArry[24] = XOR_L;
sendArry[25] = XOR_H;

sendArry[26] = 0x03;
sendArry[27] = 0x03;

}


UDP代码:

void __fastcall TMainForm::Button4Click(TObject *Sender)
{
String strfilePath;
char recvBuffer[66];
strfilePath = "c:\\uptime.dat";
ifstream infile(strfilePath.c_str(), ios::binary);
if (!infile)
{

}
else
{
infile.read(recvBuffer, 66);
}

// String str = "我是一个小菜菜";
// this->IdUDPClient->Send(str, TEncoding::Unicode);
TBytes arr;
arr.set_length(28);

Send_CODE *psend_code = new Send_CODE();

Byte sendArry[28];

psend_code->Send_0000H(sendArry);

memcpy(&arr[0], sendArry, 28);

this->IdUDPClient->SendBuffer("192.168.2.255", 12345, arr);

delete psend_code;
}
ccrun.com 2011-08-24
  • 打赏
  • 举报
回复
你原先是如何是XOR运算的?
tulipcaicai 2011-08-24
  • 打赏
  • 举报
回复
一楼和四楼的方法都好用,谢谢。
我现在的问题是要进行XOR运算,之前用的是Byte数组,现在用TBytes时,TByteDynArray 是不支持 XOR的,请问我要怎么转换呢?

tulipcaicai 2011-08-24
  • 打赏
  • 举报
回复
谢谢大家,结贴
ccrun.com 2011-08-23
  • 打赏
  • 举报
回复
楼主的代码有几个问题:

1. 正如2楼平平所说,Send_0000H函数中,将函数内的byte数组作为返回对象,这是很危险的,你得到的很可能不是预期的值。改成以参数的方式代入Bytes数组地址为佳。

2. IdUDPClient和IdUDPServer之间如果要传输String字符串,只需注意Bytes和String的转换:
#include <idglobal.hpp>
// 发送方:将String转成TBytes
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String str = "我了个艹的abc";
IdUDPClient1->Send(str, TEncoding::Unicode);
}
// 接收方:将TBytes转成String
void __fastcall TForm1::IdUDPServer1UDPRead(TIdUDPListenerThread *AThread,
TBytes AData, TIdSocketHandle *ABinding)
{
String str = BytesToString(AData, TEncoding::Unicode);
ShowMessage(str);
}


3. 就楼主的代码来说,Bytes数组中存在0x00的成员,还是建议直接以TBytes的方式发送,以保证数据的完整性。IdUDPClient组件重载了SendBuf函数,其中一个重载方式,接收TByteDynArray类型的参数,这个TByteDynArray就是Byte类型的动态数组。楼主的代码我略修改一下:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
IdUDPServer1->DefaultPort = 10000;
IdUDPServer1->Active = true;

IdUDPClient1->Host = "127.0.0.1";
IdUDPClient1->Port = 10000;
}
//---------------------------------------------------------------------------
void Send_0000H(Byte sendArry[])
{
short int XOR_L, XOR_H;

sendArry[0] = 0xeb;
sendArry[1] = 0x90;
sendArry[2] = 0xeb;
sendArry[3] = 0x90;

for (int i = 4; i < 20; ++i)
{
sendArry[i] = 0xff;
}

sendArry[20] = 0x00;
sendArry[21] = 0x00;

sendArry[22] = 0x00;
sendArry[23] = 0x00;

// XOR_L = MainForm->IntXOR16(sendArry,24, 4, 23) >> 16;
// XOR_H = MainForm->IntXOR16(sendArry,24, 4, 23) >> 8;
//
// sendArry[24] = XOR_L;
// sendArry[25] = XOR_H;

sendArry[26] = 0x03;
sendArry[27] = 0x03;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Byte sendArry[28];
Send_0000H(sendArry);

TByteDynArray bda;
bda.set_length(28);

memcpy(&bda[0], sendArry, 28);

IdUDPClient1->SendBuffer(bda);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdUDPServer1UDPRead(TIdUDPListenerThread *AThread, TBytes AData, TIdSocketHandle *ABinding)
{
ShowMessage(AData.Length);
}
zzbinfo 2011-08-23
  • 打赏
  • 举报
回复
+1
IdUDPClient1->SendBuffer
pp616 2011-08-23
  • 打赏
  • 举报
回复
Byte* Send_CODE::Send_0000H()
{
...
Byte sendArry[28];
...
}
sendArry是声明在函数栈里的, 当函数返回时sendArry就释放掉了,或者说不在你程序的控制范围了。你返回它的指针已经没有意义了。别的程序随时可能重写那个内存块的。
周药师 2011-08-23
  • 打赏
  • 举报
回复
发Byte 的数组,何须转成UnicodeString那么麻烦
直接发送TBytes 类型即可

void __fastcall TForm1::FormShow(TObject *Sender)
{
IdUDPServer1->DefaultPort = 10006;
IdUDPServer1->Active = true ;
}
void __fastcall TForm1::IdUDPServer1UDPRead(TIdUDPListenerThread *AThread, TBytes AData,
TIdSocketHandle *ABinding)
{
//TBytes为字节数组类型...
AnsiString ls_str="" ;
int li_len = AData.Length ;
for(int i =0 ;i<li_len ;i++)
ls_str = ls_str + (char)AData[i] ;
Memo1->Lines->Add(ls_str);
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
TBytes bt;
bt.set_length(2);//设定数组长度
bt[0]='A';
bt[1]='B';
IdUDPClient1->SendBuffer("127.0.0.1",10006,bt);
}

13,871

社区成员

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

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