buff: array[0..512]of char,可是我总读到实际内容少头2个字,能不能运用指针把buff前面的2个char读出来? 简单的说我通过共享内存文件与vc++程序交换数据这个buff的值是vc++给到内存中的我去读的时候,总无法读第1个字节的内容我知道第1个char的指针在buff[0]前面可是我读不到它的值 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 array[0..512]of char实际是513个字节、它的前面有没有其他数据,有否考虑字节对齐? array[0..512]of char实际是513个字节、是从零开始的~~ type TSocketArmorData = record hSocketArmorWnd: HWND; uMsg: uint; uMsgAccept: uint; szProcessName: array[0..511] of Char; nFlags: Integer; addr: SOCKADDR_IN; buff: array[0..64 * 1024-1] of Char; len: Integer; end;var pSocketArmorData: ^TSocketArmorData; hFileMapping := CreateFileMapping($FFFFFFFF, 0, PAGE_READWRITE, 0, SizeOf(TSocketArmorData), 'SocketArmorFileMapping'); if hFileMapping = 0 then exit; pSocketArmorData := MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);读szprocessname正确读buff,总少前3个char读nflags错误读len总为0,(错误) typedef struct _SOCKET_ARMOR_DATA //注意:这是8个字节对齐方式{ HWND hWnd; UINT uMsg; UINT uMsgAccept; char szProcessName[MAX_PATH]; int nFlags; SOCKADDR_IN addr; char buff[64*1024]; int len; } SOCKET_ARMOR_DATA,*PSOCKET_ARMOR_DATA;翻译为: TSocketArmorData = record hSocketArmorWnd: HWND; uMsg: Cardinal; uMsgAccept: Cardinal; szProcessName: array[0..511] of Char; nFlags: Integer; addr: SOCKADDR_IN; buff: array[0..64 * 1023] of Char; len: Integer; end;读szprocessname正确读buff,总少前3个char读nflags错误读len总为0,(错误) 简单的说:我能不能读位于内存char a[0];a 前面的2个char就是a[-2] 我觉得应该可以你可以用取绝对地址ABSOLUTE试试先定义一个指针然后取字串绝对地址减2后试试??? 有没有例子呀?我还没test过指针 var p:pointer;p:=absolute(a);p:=p-2;i:=p^;试试 var p: pointer; I: char;begin p := absolute(psocketarmordata.buff[0]); p := p - 2; i := p^;end;提示缺少操作符,我看帮助上说应该这样用:var Str: string[32]; StrLen: Byte absolute Str; SORRY我没有细看帮助这个东东一般也用得少你还可以试试@地址符 p:[email protected][0]; p:=p-1; i:=p^;提示P:=p-1 操作符错误 好象不能减两个字节,除非是,BYTE 啊,faintinteger类型能不能读它前2个字节的integer数据? 其实让char向左移动1个byte就可以我的定义正好是8字节或者让integer向左移动,然后再读 唉看来总不用指针不行了你直接p:=@strshowmessage(string(p^))看是否是你想要的结果?? 跨语言处理记录/结构数据时,要用紧凑格式:在Delhi中: TSocketArmorData = packed record hSocketArmorWnd: HWND; uMsg: Cardinal; uMsgAccept: Cardinal; szProcessName: array[0..511] of Char; nFlags: Integer; addr: SOCKADDR_IN; buff: array[0..64 * 1023] of Char; len: Integer; end;在VC++中:#pragma pack( 1 ) // 变成一个字节对齐方式typedef struct _SOCKET_ARMOR_DATA{ HWND hWnd; UINT uMsg; UINT uMsgAccept; char szProcessName[MAX_PATH]; int nFlags; SOCKADDR_IN addr; char buff[64*1024]; int len; } SOCKET_ARMOR_DATA,*PSOCKET_ARMOR_DATA; 老鱼 p:[email protected][0]; hexeditor1.lines.add(string(p^));程序运行时候报错,说地址错误我感觉它跟hexeditor1.lines.add(psocketarmordata.buff)没什么区别还是需要让char[0]的地址向左移动1个byte一定是这2行中比vc++多占8字节内存! szProcessName: array[0..511] of Char;//szprocessname一般20个字,读头20字正确 nFlags: Integer; 不是addr: SOCKADDR_IN;有影响呢?‘SOCKADDR_IN到底是什么类型?定义为string就错了你把两边都去掉addr试试你的数据是存在文件中吗ms:Tmemorystream;test:pSocketArmorData ;buf:array [0..1000000000] of char;//>=sizeof (TSocketArmorData )ms:=tmemorystream.create;ms.loadfromfile('...');ms.read(buf,sizeof(TSocketArmorData));copymemory(test,buf,sizeof(tsocketArmordata)); c里面的record是8字节对起方式delphi好象是2字节不知道delphi能不能8字节对起record 你把szProcessName写满512各字节看是否还正确 真搞不懂,读integer数据都错读char数据都能读到,只是buff少了2字节 to newjy 我们的数据来自内存我测试过各种声明的组合,调试了3天结果都是buff少的字节更多有时候它会少6个字节 新手求教 怎样在panel中再动态创建一个panle DELPHI实现ping 急求 Delphi编写 三次样条插值函数 求解:关于DELPHI&ACCESS开发的网版程式出现的问题!! 日期模糊查询sql语句 vb与delphi开发数据库那个更方便 用BDE连接SQLSERVER数据库,打开时为什么总是提示输入密码 如何实现计算字段的求值 如何设置一个表的ID字段.急急急!!! 我最近买了一套软件,有一个硬加密狗允许两台机器用,怎么样破掉啊?请高手提些宝贵意见! 如何让delphi 的record采用8字节对起方式? 30分求答,对你来说完全是个意外的惊喜,相信我没错的
它的前面有没有其他数据,有否考虑字节对齐?
TSocketArmorData = record
hSocketArmorWnd: HWND;
uMsg: uint;
uMsgAccept: uint;
szProcessName: array[0..511] of Char;
nFlags: Integer;
addr: SOCKADDR_IN;
buff: array[0..64 * 1024-1] of Char;
len: Integer;
end;
var
pSocketArmorData: ^TSocketArmorData; hFileMapping := CreateFileMapping($FFFFFFFF, 0, PAGE_READWRITE,
0, SizeOf(TSocketArmorData), 'SocketArmorFileMapping');
if hFileMapping = 0 then exit;
pSocketArmorData := MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
读szprocessname正确
读buff,总少前3个char
读nflags错误
读len总为0,(错误)
{
HWND hWnd;
UINT uMsg;
UINT uMsgAccept;
char szProcessName[MAX_PATH];
int nFlags;
SOCKADDR_IN addr;
char buff[64*1024];
int len;
} SOCKET_ARMOR_DATA,*PSOCKET_ARMOR_DATA;翻译为:
TSocketArmorData = record
hSocketArmorWnd: HWND;
uMsg: Cardinal;
uMsgAccept: Cardinal;
szProcessName: array[0..511] of Char;
nFlags: Integer;
addr: SOCKADDR_IN;
buff: array[0..64 * 1023] of Char;
len: Integer;
end;
读szprocessname正确
读buff,总少前3个char
读nflags错误
读len总为0,(错误)
我能不能读位于内存
char a[0];
a 前面的2个char
就是a[-2]
你可以用取绝对地址ABSOLUTE试试
先定义一个指针
然后取字串绝对地址
减2后试试???
我还没test过指针
p:=absolute(a);
p:=p-2;
i:=p^;
试试
p: pointer;
I: char;
begin
p := absolute(psocketarmordata.buff[0]);
p := p - 2;
i := p^;
end;
提示缺少操作符,我看帮助上说应该这样用:
var Str: string[32];
StrLen: Byte absolute Str;
我没有细看帮助
这个东东一般也用得少
你还可以试试@地址符
p:=p-1;
i:=p^;
提示P:=p-1 操作符错误
integer类型能不能读它前2个字节的integer数据?
我的定义正好是8字节
或者让integer向左移动,然后再读
看来总不用指针不行了
你直接p:=@str
showmessage(string(p^))看是否是你想要的结果??
TSocketArmorData = packed record
hSocketArmorWnd: HWND;
uMsg: Cardinal;
uMsgAccept: Cardinal;
szProcessName: array[0..511] of Char;
nFlags: Integer;
addr: SOCKADDR_IN;
buff: array[0..64 * 1023] of Char;
len: Integer;
end;在VC++中:
#pragma pack( 1 ) // 变成一个字节对齐方式
typedef struct _SOCKET_ARMOR_DATA
{
HWND hWnd;
UINT uMsg;
UINT uMsgAccept;
char szProcessName[MAX_PATH];
int nFlags;
SOCKADDR_IN addr;
char buff[64*1024];
int len;
} SOCKET_ARMOR_DATA,*PSOCKET_ARMOR_DATA;
p:[email protected][0];
hexeditor1.lines.add(string(p^));
程序运行时候报错,说地址错误
我感觉它跟
hexeditor1.lines.add(psocketarmordata.buff)没什么区别
还是需要让char[0]的地址向左移动1个byte一定是这2行中比vc++多占8字节内存!
szProcessName: array[0..511] of Char;//szprocessname一般20个字,读头20字正确
nFlags: Integer;
你把两边都去掉addr试试
你的数据是存在文件中吗ms:Tmemorystream;
test:pSocketArmorData ;
buf:array [0..1000000000] of char;//>=sizeof (TSocketArmorData )ms:=tmemorystream.create;
ms.loadfromfile('...');
ms.read(buf,sizeof(TSocketArmorData));
copymemory(test,buf,sizeof(tsocketArmordata));
delphi好象是2字节不知道delphi能不能8字节对起record
szProcessName写满512各字节看是否还正确
读char数据都能读到,只是buff少了2字节
我们的数据来自内存
我测试过各种声明的组合,调试了3天
结果都是buff少的字节更多
有时候它会少6个字节