pointer问题(100)

  • 主题发起人 主题发起人 xuezhonghuaandy
  • 开始时间 开始时间
X

xuezhonghuaandy

Unregistered / Unconfirmed
GUEST, unregistred user!
1、读数据的时候是这样的A: array[0..3] of byte;...A[3] := PByte(Integer(FTraces[TraceIndex].Buf) + offset + 0)^;A[2] := PByte(Integer(FTraces[TraceIndex].Buf) + offset + 1)^;A[1] := PByte(Integer(FTraces[TraceIndex].Buf) + offset + 2)^;A[0] := PByte(Integer(FTraces[TraceIndex].Buf) + offset + 3)^;Result := PSingle(@A)^;这个是调换了位置的意思吗?2、反过来写数据的时候该怎么办呢A: array[0..3] of byte;Buf: Pointer;...PSingle(Integer(Buf))^ := Value;A[0] := PByte(Integer(Buf) + 0)^;A[1] := PByte(Integer(Buf) + 1)^;A[2] := PByte(Integer(Buf) + 2)^;A[3] := PByte(Integer(Buf) + 3)^;PByte(Integer(FTraces[TraceIndex].Buf) + offset + 0)^ := A[3];PByte(Integer(FTraces[TraceIndex].Buf) + offset + 1)^ := A[2];PByte(Integer(FTraces[TraceIndex].Buf) + offset + 2)^ := A[1];PByte(Integer(FTraces[TraceIndex].Buf) + offset + 3)^ := A[0];这样好像是不行的请各位多指教
 
不知道你想说哪个地方不行。具体一些。
 
znxia:您好这样保存之后再次读的时候每次总是报错大致意思是说无效的Single错误的地方是定位在这的上一行:A[3] := PByte(Integer(FTraces[TraceIndex].Buf) + offset + 0)^;所以我估计是保存的时候出错了但具体怎么错的我也不太清楚我想得到的结果是把原来的某个数的高低位给互换一下1 那样做了之后是不是也相应的把原来数据的高低位给互换了?如果成立的话2 做了一些运算后想把它再保存下来就是这么个意思不知道我的想法是否正确原始数据的定义是这样来读的TTrace = record Size: Integer; Buf: Pointer; end; TTraces = array of TTrace;
 
看半天,没看懂 你的 buf:pointer 指向的是什么,没看到赋值,呵呵我下面这个程序只是把高低位互换,以4字节的int64为例procedure TForm1.btn1Click(Sender: TObject);var a:Int64;pb,pfb:PByte;tmp:Byte;i:Byte;begin//a:=4277991664;//1111 1110 1111 1100 1111 1000 1111 0000pfb:=pbyte(@a);pb:= pfb;for i:=0 to 1 dobegin tmp:=pb^; ShowMessage(IntToStr(tmp)); //转换 pb^:=pbyte(Pointer(Integer(pb)+(3-i) ))^; pbyte(Pointer(Integer(pb)+(3-i) ))^:=tmp; tmp:=pb^; ShowMessage(IntToStr(tmp)); Inc(pb);end; ShowMessage(IntToStr(a));end;
 
枝上柳绵您好PSingle(Integer(Buf))^ := Value;这个算不算是赋值pbyte(Pointer(Integer(pb)+(3-i) ))^;和pbyte((Integer(pb)+(3-i))^;的区别是什么呀另外要是把a:Int64;换成a:Single;该怎么实现呢
 
其实我给你说了下面的道理你就明白了,呵呵!内存中的存储方式:Word LBHB 低字节在前,高字节在后DWord(Int64) LoW(LBHB)hiW(LBHB) 低字在前,高字在后a:Int64;换成a:Single;该怎么实现呢 ,关键技术是一样的,因为编译器在编译的事后早就知道他是Single了,呵呵!
 
枝上柳绵您好PSingle(Integer(Buf))^ := Value;这个算不算是赋值pbyte(Pointer(Integer(pb)+(3-i) ))^;和pbyte((Integer(pb)+(3-i))^;的区别是什么呀另外要是把a:Int64;换成a:Single;该怎么实现呢 其实Int64和 single都是4个字节,存储上没有任何区别,(int64的首字节是数据,而single首字节是符号)我只所以设置成INT64是为了方便你高低位互换后看数据,你完成可以直接把 int64换成single{PSingle(Integer(Buf))^ := Value;这个算不算是赋值}这个肯定不是赋值了,你buf:=...才是赋值撒现在它指向的是乱码,呵呵,看来你的C语言指针没学好啊{pbyte(Pointer(Integer(pb)+(3-i) ))^;和pbyte((Integer(pb)+(3-i))^;的区别是什么呀}没有区别,只是方便你理解
 
wql您好是不是可以这样理解所有类型的数据在pc机上的内存存储方式都是低字节在前,高字节在后枝上柳绵您好不好意思学的太牵强了让您见笑了您提供的代码是只交换了1和4字节的内容吧得慢慢学快了消化不了[:(]谢谢两位的指教其实我想做个东西涉及到要读取2进制的数据这种数据大体来说分为微机(PC)上的和工作站上的2类然后每种下面又分IBM、IEEE754格式的最后就是各自下面的整型、浮点...不知道我这样表述是不是正确在微机(PC)上:定义了Stream: TFileStreamwith Stream dofor ... to .. dobegin Position := ...; Read(...,...);end;逐个的读是没有什么大的问题[:)]为了加快速度采用了上面的方法Stream.Read(FTraces.Buf^, FTraces.Size);这样一次可以读很多不知道这样是不是可行的但是对于工作站上的来说:我查了一些资料说是要交换高低位也就是所谓的大头和小头问题也就引出了这个帖子实在是很汗颜给诸位添麻烦了我的另外一个帖子就是询问关于这两种格式的http://delphibbs.com/delphibbs/dispq.asp?lid=3884509如果可以一并解决请进入那里把分给您若嫌少的话可以重新开贴加分菜鸟一只在这里多谢了
 
多人接受答案了。
 
后退
顶部