delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks
两个字节,如果写入一个大于65535的数? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061220165725103.html
正常情况下FFFF为65535,如何突破呢?

突破不了了,想办法改成四个字节吧

有没有什么压缩算法?或高招,大家帮我想想.今晚就散分.

觉得已没有可能了。除非这个范围内有大量的数据段永远不会用到。

比如说连续有5个1就写入51.

这个二进制1111111111111111,如果写入161,即F1.

那你如果写入51时怎么办?数据就乱了

我想有没有一种这样的思路,数据压缩我也是一样的吗?

用个指针传址好了,呵呵,或者使用宏定义

自己定义一个读写规则吧,比如象浮点数的存储协议一样

Elysium(東鱗覀爫),具体怎么做?我往一个二进制文件中写入Filewrite(handle,VALUE,2);  
  VALUE怎么突破65535?

楼主,不要想了,赶紧加字节吧

压缩机制也是可以,但是好像是针对字节,不是针对位,如果就两个字节,16位,意义不大

用的时候替换可以,写进去就不行了,比如写进去一个"A""A"表示大于65535倒是可以,但是如果从0~65535都可能出现的话也是不行,所有组合都被枚举了

晕了  
  除非你想用大于1的步进计数,要不然是不可能的  
  就跟让你用牙咬自己的耳朵,除非你是假牙或假耳朵

除非数字是整倍数的,比方说,只用10以上的数,那么可以增加10倍容量。哈哈

如果是向两个字节里写入大于65535的整数,楼主还是不要想了,乖乖的增加字节吧

二个字节一共65536(0-65535)种状态,除非你的数据是有规律的,否则不可能表示大于65535的数

楼主真强,现在的高手都习惯了解决难问题  
  碰上个这么XX的,就...哈哈,真逗...

:)

加字节吧,我以前也试过,不行的,呵呵,

keiy()   的话  
   
  二个字节一共65536(0-65535)种状态,除非你的数据是有规律的,否则不可能表示大于65535的数  
   
   
 

把它和65536的差写进去

FFFF   =   65535   是使用16进制,   如果使用更高的进制可以吗?例如17进制,  
  0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F   H  
  FFFF   =   十进制   15   *   16^3   +   15*16^2   +   15*16   +   15   =   65535  
  HHHH   =   十进制   16   *   17^3   +   16*17^2   +   16*17   +   16   =   ..  
 

如果使用更高的进制可以吗?例如17进制  
  =======================================================================  
  进制只是一种表示方法,最终计算机只认识0和1,你就20进制也不行,反正2字节只有16个位。

没事找事...

理论上讲,等量子计算机开发出来,就有突破了。

楼主真是有创意,我不得不服.......

只有10块钱,怎么买一条电脑?  
   
  要么加钱,要么就用10块钱的电脑!

无语-_#!

如果真要写个比65535大的数,其实,最简单的方法是……  
  11111111   11111111  
  前8位是底数,后8位是幂,  
  也就是说,用2字节+一系列算法,把FF   FF让计算机理解成FF的FF次方…………

看到这么多**对这个问题感兴趣,我还是保留一下.本来答应昨天结贴的,或许被管理员提到首页呢~

For_suzhen(不懂装懂)和ClarkKidd(神!啊!)   的想法不错.有等大家讨论.

注意啊,人家楼主说的是:   两个字节,如果写入一个大于65535的数.       ----写入!!!!!!

一分钟,如何突破60秒?

可能我的表达有误,让大家误解了.现在有一批记录,记录号在0..10万之间,不连续.现在把按条件查询出来的记录号写入两个字节.当然65535以下是可以写入两个字节的,大于65535的记录号没办法写入了,请问如何作处理了,大家给个好的办法?

这样想就是错了,略懂一点数学的人都知道大于65535数是无法用两个字节表示的

必需在两个字节里写吗?不能放宽一些吗?

就象前面ClarkKidd(神!啊!)   所说,如果用一字节做指数,一字节做底,这样可以表达一个很大的数.我只要表达出来就可以,而不是非要写入个65535.这样的话就需要一个算法,用两个字节表达0..10万的算法.

我在给客户做个索引方面的程序.现在2个字节,程序在650M左右,如果4个字节就超出1G了.一张CD光盘刻录不下了.总不至于换DVD吧.这年头还是考虑一下贫下中农吧.

上述方法虽然能很大,只是它是指数的函数,是跳跃式的,它不是连续。最终超过不65535记录。  
  除非你的值都在那个曲线上,天下没这么巧的事。

把电脑放到冰箱里,当温度达到零下4摄氏度的时候内存会膨胀,2个字节可以存储0..250000  
  电脑放到微波炉里,当温度达到100摄氏度的时候内存也会膨胀,具体大小不详。

我还有个最简单的法,同时启动两个程序不就OK了?  
  启动三个,你会有6个字节的空间呢!!!!!!!!!!!!!!!!!

LiHaiYan2001()         一分钟,如何突破60秒?  
  ---------------------------------------------------  
  支持  
   
   
  楼主:                         我在给客户做个索引方面的程序.现在2个字节,程序在650M左右,如果4个字节就超出1G了.一张CD光盘刻录不下了.总不至于换DVD吧.这年头还是考虑一下贫下中农吧.  
  -----------------------------------------------------------------------------------  
  楼主能把上述言论解释一下吗?

两个字节,无论你用什么方法,它最多表示出65536种不同的值。  
   
  你可以用来表示出0~65535这连续的65536个整数,也可以用来表示-32768~32767这连续的65536个整数,也可以用来表示65536个不同的字符(就象Unicode)。  
   
  但是无论如何,两个字节也表示不出第65537个值来的,这个再讨论也没结果的,不要浪费时间了。

其实倒是有办法的,关键在于楼主所说的不连续这一项,  
  可以用这种方法  
  两个字节,前一个字节   a   表示数值表的索引,后一个字节   b   表示偏差值,首先在文件首部建一个不连续数值表   X   ,长度256,那么存入的值可以这样表示   X[a]+b   ,但这样仍然只能有65536种变化,也就意味着你的索引数据长度只能小于等于65536,  
  还有一种方法,压缩,将数据压缩起来,这样原数据应该可以超过1G,在使用的时候取出适当的部分进行解压缩

楼主可以牺牲点精度么

理论上把所有数据都可以压缩成一个0和一个1  
  但有没有想到压缩算法占用的空间呢?

压缩算法是需要占空间,但是相比于节省出来的空间来说就不足为道了

以上两位真把压缩算法当成"神法"了,一共两个字节,16个Bit,还要压缩?

Elysium(東鱗覀爫),具体怎么做?我往一个二进制文件中写入Filewrite(handle,VALUE,2);  
  VALUE怎么突破65535?  
  --------------------------------------------  
  是不是做的文件编码规范不满足需求了,只能改成4个字节了。  
  不过有一种编码方式是自适应需求的,可以参考一下:  
   
  uintvar   -   variable   length   unsigned   integer  
   
  Many   fields   in   the   data   unit   formats   are   of   variable   length.   Typically,   there   will   be   an   associated   field   that   specifies   the   size   of   the   variable   length   field.   In   order   to   keep   the   data   unit   formats   as   small   as   possible,   a   variable   length   unsigned   integer   encoding   is   used   to   specify   lengths.   The   larger   the   unsigned   integer,   the   larger   the   size   of   its   encoding.  
   
  Each   octet   of   the   variable   length   unsigned   integer   is   comprised   of   a   single   Continue   bit   and   7   bits   of   payload.  
   
  To   encode   a   large   unsigned   integer,   split   it   into   7-bit   fragments   and   place   them   in   the   payloads   of   multiple   octets.   The   most   significant   bits   are   placed   in   the   first   octets   with   the   least   significant   bits   ending   up   in   the   last   octet.   All   octets   MUST   set   the   Continue   bit   to   1   except   the   last   octet,   which   MUST   set   the   Continue   bit   to   0.  
   
  For   example,   the   number   0x87A5   (1000   0111   1010   0101)   is   encoded   in   three   octets:  
  1   0000010   1   0001111   0   0100101.  
   
  The   unsigned   integer   MUST   be   encoded   in   the   smallest   encoding   possible.   In   other   words,   the   encoded   value   MUST   NOT   start   with   an   octet   with   the   value   0x80.  
   
  In   the   data   unit   format   descriptions,   the   data   type   uintvar   will   be   used   to   indicate   a   variable   length   integer   field.   The   maximum   size   of   a   uintvar   is   32   bits.   It   will   be   encoded   in   no   more   than   five   octets.   It   MUST   be   present   even   if   its   value   is   zero.  
   
  以上摘自WAP协议族WSP规范   (WAP-230-WSP)8.1.2,主要意思就是说把要编码的无符号整形数分为n个7bit,除了最后的一个7bit前补0外,其它的前面都补1,表示后面还有连续的字节。

晕倒,jadeluo(秀峰)   没搞明白我说的意思,我说压缩是指使用4字节来存储,然后把总体存储的数据进行压缩,压缩算法我还是懂一点的,当然明白2字节根本没有压缩的余地,但是最后存储出的文件当然可以有效压缩了,而且压缩比恐怕还是蛮高的....

报错,或者给截取了部分,结果还是错误

谢谢大家的讨论,放分了.

汗,使用的时候当然还要解压缩的说,

本来要结贴,但两次结贴没成功,停在那里死了.

var  
  s:string;  
  a,b:Integer;  
  begin  
   
      a:=StrTOInt(edit1.Text)   Div   256;  
      b:=StrToInt(edit1.Text)   Mod   256;  
      s:=s+chr(a)+chr(b);  
   
   
  看下这样行不行  
  可以存为两个字节

建议开发26个字母剩余的部分!   呵呵

to   ybbhond(路边卖菜的)  
  ===========================================================================  
  知不知道65536   div   256是多少?你1字节能放下吗?

默认+65535,比如你写个0001就是65536,那不就全部大于65535了。  
  如果要表示1至大于65535的数,楼主梦想,或者每一位都可以不止表示0和1。

别钻牛角尖了,换换思路吧??   你能把1秒的时间分成2秒的时间吗???  
   
  还是把你的需求说清楚吧、、、  
   
 

一张光盘就600M,假如客户10个G的数据,你都要刻在一张光盘上吗??  
   
  即使能,那以后如果数据再涨呢,你还非得硬要向一张光盘上写吗???  
   
  要么换思路,能多张盘刻录,同时你的程序又能读取,要么重新设计方案,看怎么能使索引尽量小而承受更大的数据量。  
   
  不过有一点是肯定的:你抱着那2字节,等一万年,你也不能把大于65536的数值写进去!!

数据是有规则的!你可以建立你自己的规则!  
  如果你你数据只在0..>65535范围的话,你可以:  
  >65535的数    
  65536=-1  
  65537=-2  
  65538=-3  
  ......  
  写进磁盘里去,在自己读出时,-1,-2,-3.....就转换一下就好了!  
 

如果你能规定1个字节不是8bit就可以了,比如规定1个字节是20位,看看能不能保存65536

to       maozefa(阿发伯)    
   
  65536   div   256  
   
  chr  
  取他的字符,结果是一位吧,但字符是一些乱码,  
   
  不过都是可以还原成原来的数值。  
   
 

To   ybbhond(路边卖菜的):   你需要好好补补基础课了。  
   
  65536   div   256   =   256,256如何存入一个字节中?这个问题与楼主的65536如何存入两个字节完全一样,同样无解。  
   
  前面已经说过了,两个字节只能表示65536个不同的值,想表示第65537种值是没有可能的,不要再在这上面浪费时间了。

同意楼上,就像一个位怎样存储大于2的数字一样。肯定无解。

如果你真的要存,不如转换字符‘56568989892323’你想多大就多大。。。。读时就取几位就好了。。。。

hsgrass37301(零点)   兄与我想法一样! 这是个最简单的方法!  当然压缩也没问题! 只是算法麻烦些! 如果真的想用这方法和我联系吧     现在上班没时间写!:)     MSN:   xhxlss@163.com

zhmnsw(糖醋鼻子)  
  理论上把所有数据都可以压缩成一个0和一个1  
  ------------------------------------------  
   
  你们老师就这样教你的?  
 

哈哈,首先肯定楼上ahjoe(强哥)反问得好,反问得对。  
   
  然后,跟zhmnsw(糖醋鼻子)等开个玩笑:你比较适合去学道家阴阳学。因为对阴阳家来说,世界万物,无非阴阳。道生一,一生二,二生三,三生万物。道家看数据块:1就是有数据,0就是无数据。哈哈。精度要求不高。

唉,原来如此,这个问题还要讨论吗?  
  数据库中的字段长度,谁都知道需要根据实际数据调整,你明明可能要存到5个字节,你就给它两个字节长度,怎么弄,现在上个厕所都要收钱的!  
  都这样搞,还建索引干吗,数据库都论TB的了,不知道你省的那点空间以后可能会给你造成多大的麻烦!

谢谢大家,从大家的讨论中我受益匪浅,而lxtnt()   给我的帮助最大,而我要保存的ID号全是正数,而当大于65535时,我是这样做保存的,即:  
  -(ID-65535)  
  读出来的时候判断是否是负数,如果为负,则程序转换回去。  
   
  今天放一下分,看能否成功,前两次都不成功.

楼主啊,看了你最后一个回复后,我无语了……  
  看来你还是没弄明白整数在计算机中的保存方式啊。  
  如果用两个字节来表示带符号整数的话,它只能表示-32768~32767这个范围了(一共65536个不同的值),你的问题还是解决不掉的。

posted on 2008-10-14 16:36 delphi2007 阅读(288) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。