我已经设法将RC4实现从PolarSSL移植到delphi,因为我需要在两个应用程序(C和Delphi)之间进行加密通信,但问题是,加密数据永远不会相同,两个代码都自己加密和解密数据成功但不是由另一个加密的数据.
以下是两个代码:
C代码(取自PolarSSL)
typedef struct
{
int x; /*!< permutation index */
int y; /*!< permutation index */
unsigned char m[256]; /*!< permutation table */
}
arc4_context;
void arc4_setup(arc4_context *ctx, unsigned char *key, int keylen)
{
int i, j, k, a;
ctx->x = 0;
ctx->y = 0;
for( i = 0; i < 256; i++ ) ctx->m[i] = (unsigned char) i;
j = k = 0;
for( i = 0; i < 256; i++, k++ )
{
if( k >= …Run Code Online (Sandbox Code Playgroud) 我正在尝试一次从服务器接收单个数据包,因为数据包的运行速度太快,并且每个数据包的大小都未定义,因此调用带有读取字节数的recv()会读取第一个数据包,也许是其中的一部分第二个数据包。由于每个数据包都以NULL终止,因此我想逐字节读取直到接收到NULL字节。
int recvLen = 0;
char TB;
char recvBuffer[1024];
while (recv(Socket, &TB, 1, 0) > 0 && TB != 0 && recvLen < 1024)
{
recvBuffer[recvLen] = TB;
recvLen++;
}
Run Code Online (Sandbox Code Playgroud)
我认为这种方法根本无效。如果服务器发送了1024个字节,recv()将被调用1024次。
在接收到NULL字符之前,是否还有其他方法可以调用recv(),或者有比我正在使用的方法更好的方法?
编辑:我在从服务器发送的数据的前面添加了数据包大小,但是现在,如果一个错误的数据包甚至有时无缘无故,数据包就会混乱,并且无法接收到正确的数据。这是我的代码
#define UPLOAD_LEN 2755
int PacketSize, recvLen;
char Size[4];
char recvBuffer[UPLOAD_LEN+1];
while(1)
{
if(recv(Socket,Size,4,0)>0)
{
Size[4] = '\0';
PacketSize = atoi(Size);
if (PacketSize > UPLOAD_LEN || PacketSize <= 0) continue;
recvLen = recv(Socket, recvBuffer, PacketSize, 0);
} else recvLen = -1;
if (recvLen > 0)
{ …Run Code Online (Sandbox Code Playgroud) 是否有任何简单的代码示例或如何使richedit控件做如何做语法 - 突出显示?我尝试过SynEdit,但它对我来说非常复杂,我想知道是否有一个小代码片段可供我使用?或者只是想知道如何像IDE那样快速地完成它?
干杯;
我习惯于在一个表格上创建它10次,这没关系,直到我试图传递这个数字,它开始吃系统资源,无论如何我可以创建这样的组件?对于模拟器项目,需要8位来指示二进制寄存器的值

任何帮助,评论,想法都非常感谢.TY.
我设法通过断开连接修复一些错误,现在每当文件传输CPU使用率变为100%时,我不知道我做错了什么:S .....
const
MaxBufferSize = 1024;
type
TClient = class(TObject)
public
AContext: TIdContext;
FileSize: Integer;
Canceled: Boolean;
Transfered: Integer;
procedure ReceiveData;
procedure Update;
end;
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
Data: string;
Client: TClient;
Item: TListItem;
begin
Data := AContext.Connection.IOHandler.ReadLn;
//Data := 'SEND|785548' = Command + | + FileSize
if Copy(Data, 1, 4) = 'SEND' then
begin
Delete(Data, 1, 5);
Client := TClient.Create;
Client.FileSize := StrToInt(Data);
Client.AContext := AContext;
Item := ListView1.Items.Add;
Item.Caption := AContext.Connection.Socket.Binding.PeerIP;
Item.Data := Client;
Client.ReceiveData;
end;
end;
procedure …Run Code Online (Sandbox Code Playgroud) 我试图从我的C程序发送数据包到我的Delphi程序,数据大小可变,如果我使用char数据[1024]; 它将发送1024个字节,即使数据是3个字节,如果数据大于1024,它将不会发送所有它:(
struct Packet
{
int State_;
char *Data;
};
struct Packet MyPacket;
MyPacket.Data = (char *) calloc(8, sizeof(char));
memcpy(MyPacket.Data, "thi sis", 8);
send(Socket, MyPacket, (int)sizeof(struct Packet), 0);
Run Code Online (Sandbox Code Playgroud)
谢谢哦,顺便说一下,我在windows下使用gcc
我在C和Delphi上编写应用程序,我在两者中都有XTEA加密,它完全相同,但问题是输出是不同的,即使delta和N是相同的.我真的不知道什么是错的
这是Delphi代码
type
TTeaMsgBlock = array[0..1] of LongWord;
TTeaKeyBlock = array[0..3] of LongWord;
const
DELTA = $9e3779b9;
N = 32;
procedure XTeaCrypt(var V: TTeaMsgBlock; const K: TTeaKeyBlock);
var
I: LongWord;
S: Int64;
begin
S := 0;
for I := 0 to N - 1 do begin
Inc(V[0], (((V[1] shl 4) xor (V[1] shr 5)) + V[1]) xor (S + K[S and 3]));
Inc(S, DELTA);
Inc(V[1], (((V[0] shl 4) xor (V[0] shr 5)) + V[0]) xor (S + K[(S shr 11) …Run Code Online (Sandbox Code Playgroud) 我有2个部分应用程序,Delphi和C,我有2个问题1.什么是将参数传递给Delphi的最快方法?
procedure name(Data: string); // Data is Copied to another location before passing so its slow
procedure name(var Data: string); // Data is Passed by pointer, Faster
procedure name(const Data: string); // unknown
Run Code Online (Sandbox Code Playgroud)
我想通过c中的指针传递参数,我有一个char数组和一个函数,我不想通过整个数组,切掉它的第一部分并通过其余部分
void testfunction(char **Data)
{
printf("Data = %d\n", *Data);
return;
}
int main()
{
char Data[] = "TEST FUNCTION";
testfunction(&&Data[4]); // Error
return 0;
}
Run Code Online (Sandbox Code Playgroud)谢谢
我正在阅读这个主题 http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol
我想要做的是:我有一个客户端/服务器应用程序,我想要做的是使用socks 4 BIND请求将我的服务器绑定到远程socks服务器,并使客户端连接到该socks服务器和袜子服务器将使他们连接到我的服务器(至少这就是我如何理解袜子BIND请求)
但我不完全理解它(我的英语有点不好),我问的是,当我不知道客户的任何远程IP时,是否可以这样做?因为服务器的BIND请求包必须包含远程客户端的地址,并且我真的没有,因为客户端来自未知用户从我的服务器检索状态信息(或者我可以使用0作为INANY_ADDR)?
问题是我不知道字符串将持续多长时间,所以我不知道我应该为我的数据分配多少...
char *Data = malloc(1024*1024); //???????
sprintf(Data, "%s %s", Data1, Data2);
Run Code Online (Sandbox Code Playgroud)
Data1和Data2的大小不时变化....从非常非常长到非常小我想知道是否有使用sprintf而不分配内存或其他东西,因为分配的内存有时可能很小..
谢谢
我不知道从哪里开始,我试图在linux上录制麦克风输入,是否有可能,我的意思是我知道一切都是linux下的文件描述符,它会像用fopen/fread读取文件一样容易吗?还有,它需要root吗?
谢谢.
我正在尝试移植asprintf()到Windows,因为它是Linux上的GCC库函数,并且在Windows上不存在.
我一直在计算var args的长度,所以我可以为它们分配内存.我尝试了两种方法:
将var args写入文件,然后获取函数的结果(这是写入的字节数= var args的长度),但它很愚蠢,因为用户将在他的app dir中看到内部随机数据
使用vsprintf()带有NULL 的函数作为第一个参数(将输出写入的变量),因此它返回var args的长度,但是这个失败,因为它仅适用于XP,Windows 7不允许写入NULL变量.
关于如何解决这个问题的更多想法?
我注意到mingw在调用main()之前添加了很多代码,我假设它用于解析命令行参数,因为其中一个函数被称为__getmainargs(),并且还有很多字符串被添加到最终的可执行文件中,例如mingwm.dll和一些错误字符串(包括应用程序崩溃)说mingw运行时错误或类似的东西.
我的问题是:有没有办法删除所有这些东西?我不需要所有这些东西,我尝试了tcc(微小的c编译器)它完成了这项工作.但不像gcc那样跨平台(solaris/mac)
有任何想法吗?
谢谢.