精华内容
下载资源
问答
  • Lua进行二进制文件位操作

    千次阅读 2018-08-13 18:35:33
    1.纯lua的二进制位操作 lua的二进制文件主要利用string.byte()读取某个字节,string.char()写入,示例代码如下: function v:xorFile(inputFile,outputFile) local fileIn,err = io.open(inputFile,"rb&...

    1.纯lua的二进制位操作

    lua的二进制文件主要利用string.byte()读取某个字节,string.char()写入,示例代码如下:

    function v:xorFile(inputFile,outputFile)
        local fileIn,err = io.open(inputFile,"rb")
        local content = fileIn:read("*all")
        local length = fileIn:seek("end")
        fileIn:close()
        local fileOut,err = io.open(outputFile,"wb")
        fileOut:seek("set",0)
        local item
        for i=1,length do
            item = tonumber(string.byte(content,i))
            item = bit:_xor(item,186)
            fileOut:write(string.char(item))
        end
        fileOut:close()
    end

    这是对整个二进制文件进行异或操作,那么对某个32位的uint如何操作?比如把第posSrc位的uint32异或posDst位的uint32

    function v:XORuint32(inputFile,outputFile,posSrc,posDst)
        local fileIn,err = io.open(inputFile,"rb")
        local content = fileIn:read("*all")
        local length = fileIn:seek("end")
        fileIn:seek("set",0)
        local dataA = fileIn:read(posSrc-1)
        fileIn:seek("set",posSrc+4)
        local dataB = fileIn:read("*all")
        fileIn:close()
    
        local value1 = tonumber(string.byte(content,posSrc+1))
        local value2 = tonumber(string.byte(content,posSrc+2))
        local value3 = tonumber(string.byte(content,posSrc+3))
        local value4 = tonumber(string.byte(content,posSrc+4))
    
        local key1 = tonumber(string.byte(content,posDst+1))
        local key2 = tonumber(string.byte(content,posDst+2))
        local key3 = tonumber(string.byte(content,posDst+3))
        local key4 = tonumber(string.byte(content,posDst+4))
    
        value1 = bit:_xor(value1,key1)
        value2 = bit:_xor(value2,key2)
        value3 = bit:_xor(value3,key3)
        value1 = bit:_xor(value4,key4)
    
        local fileOut,err = io.open(outputFile,"wb")
        fileOut:seek("set",0)
        fileOut:write(dataA)
        fileOut:write(string.char(value1))
        fileOut:write(string.char(value2))
        fileOut:write(string.char(value3))
        fileOut:write(string.char(value4))
        fileOut:write(dataB)
        fileOut:close()
    end
    

    附上bit的代码

    bit={data32={}}
    for i=1,32 do
        bit.data32[i]=2^(32-i)
    end
    
    function bit:d2b(arg)
        local   tr={}
        for i=1,32 do
            if arg >= self.data32[i] then
                tr[i]=1
                arg=arg-self.data32[i]
            else
                tr[i]=0
            end
        end
        return   tr
    end   --bit:d2b
    
    function    bit:b2d(arg)
        local   nr=0
        for i=1,32 do
            if arg[i] ==1 then
                nr=nr+2^(32-i)
            end
        end
        return  nr
    end   --bit:b2d
    
    function    bit:_xor(a,b)
        local   op1=self:d2b(a)
        local   op2=self:d2b(b)
        local   r={}
    
        for i=1,32 do
            if op1[i]==op2[i] then
                r[i]=0
            else
                r[i]=1
            end
        end
        return  self:b2d(r)
    end --bit:xor
    
    function    bit:_and(a,b)
        local   op1=self:d2b(a)
        local   op2=self:d2b(b)
        local   r={}
    
        for i=1,32 do
            if op1[i]==1 and op2[i]==1  then
                r[i]=1
            else
                r[i]=0
            end
        end
        return  self:b2d(r)
    
    end --bit:_and
    
    function    bit:_or(a,b)
        local   op1=self:d2b(a)
        local   op2=self:d2b(b)
        local   r={}
    
        for i=1,32 do
            if  op1[i]==1 or   op2[i]==1   then
                r[i]=1
            else
                r[i]=0
            end
        end
        return  self:b2d(r)
    end --bit:_or
    
    function    bit:_not(a)
        local   op1=self:d2b(a)
        local   r={}
    
        for i=1,32 do
            if  op1[i]==1   then
                r[i]=0
            else
                r[i]=1
            end
        end
        return  self:b2d(r)
    end --bit:_not
    
    function    bit:_rshift(a,n)
        local   op1=self:d2b(a)
        local   r=self:d2b(0)
    
        if n < 32 and n > 0 then
            for i=1,n do
                for i=31,1,-1 do
                    op1[i+1]=op1[i]
                end
                op1[1]=0
            end
            r=op1
        end
        return  self:b2d(r)
    end --bit:_rshift
    
    function    bit:_lshift(a,n)
        local   op1=self:d2b(a)
        local   r=self:d2b(0)
    
        if n < 32 and n > 0 then
            for i=1,n   do
                for i=1,31 do
                    op1[i]=op1[i+1]
                end
                op1[32]=0
            end
            r=op1
        end
        return  self:b2d(r)
    end --bit:_lshift
    
    
    function    bit:print(ta)
        local   sr=""
        for i=1,32 do
            sr=sr..ta[i]
        end
        print(sr)
    end

    以上代码异或整个文件,1M的文件需要15秒左右,显然太慢,于是换个脚本,用python试试

    2.python的二进制位操作

    import binascii
    import struct
    import sys
    
    
    def str2hex(str):
        hexs = []
        for s in str:
            tmp = (hex(ord(s)).replace('0x',''))
            if len(tmp) == 2:
                hexs.append(tmp)
            else:
                hexs.append('0'+tmp)
            return hexs
    
    arr= ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f']
    arr2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
    
    def tran(r):
        for i in range(len(arr)):
            if r == arr[i]:
                return arr2[i]
    
    def packRes(input,output,key):
        f = open(input,'rb+')
    
        hexs = []
        while True:
            t = f.read(1)
            if len(t) == 0:
                break
            hexs.extend(str2hex(t))
    
        f.close()
    
        ff = open(output,'wb')
        for i in  range(len(hexs)):
            a = tran(hexs[i][0])*16+tran(hexs[i][1])
            B = struct.pack('B',a^key)
            ff.write(B)
        ff.close()
    
    
    def main(p1,p2,p3):
        print(p1)
        print(p2)
        print(p3)
        try:
            packRes(p1,p2,int(p3))
            sys.exit(0)
        except:
            sys.exit(1)
        finally:
            pass
    
    if __name__ == "__main__":
        if len(sys.argv) >= 1:
            p1 = sys.argv[1]
            p2 = sys.argv[2]
            p3 = sys.argv[3]
            main(p1,p2,p3)

    同样的文件要1秒左右,效率提升显著,然而还是不满足需求,还是试试C++吧

    3.c++的二进制位操作

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <cstdlib> 
    
    int main(int argc, char* argv[])
    {
    	int i, count, len;
    	int key;
    	char buff[1024];
    	static char tmpfile[] = "~u~0_sw~.f~l";
    	FILE * in, *out;
    
    	if (argc <3)
    	{
    		printf("Less Parameter !\n");
    		printf("Parameter number must at least 2 !!\n");
    		return 1;
    	}
    
    	len = strlen(argv[2]);
    	in = fopen(argv[1], "rb");
    	out = fopen(tmpfile, "wb"); /* creat a temp file */
    	key = std::atoi(argv[3]);
    	
    	if (in == NULL)
    	{
    		printf("Input File \'%s\' not found !!\n", argv[1]);
    		exit(1);
    	}
    	if (out == NULL)
    	{
    		printf("Can not creat temp file \'%s\'\n", tmpfile);
    		exit(2);
    	}
    
    	while (!feof(in))
    	{
    		count = fread(buff, 1, 1024, in);
    		for (i = 0;i <count;i++)
    			buff[i] ^= 119;
    			//buff[i] ^= argv[2][i%len];
    		fwrite(buff, 1, count, out);
    	}
    
    	fclose(in);
    	fclose(out);
    	//printf(argv[1]);
    	//printf(argv[2]);
    	if( strcmp(argv[1], argv[2]) == 0)
    	{
    		remove(argv[1]);
    		printf("the key is: %d", key);
    	}
    	
    	rename(tmpfile, argv[2]);
    	return 0;
    }

    注意再创建控制台应用程序的设置,不要预编译头,否则cpp在MAC下会不兼容。

    1M左右,大概需要0.0006秒左右。因为我们最终是在lua脚本里用,所以接下来说下lua如何调用python

    4.lua调用python和C

    lua里面用os.excute来调用本地脚本。

    首先看下调用python,由于python是跨平台的,MAC和WIN10下代码一致:

    os.excute("python xxx.py inputFIle outputFile key")

    在win10下调用控制台程序的话:VS新建控制台应用程序,调试成功后cd到exe 目录

    os.excute("xxx.exe inputFIle outputFile key")

    在mac下先cd到cpp目录用g++编译

    g++ xxx.cpp

    生成a.out

    os.excute("./a.out inputFIle outputFile key")

    5.小结

    有人会喜欢那语言做比较,我认为语言是看场合的,就像你比较匕首和导弹,没有太大的意义。主要看武器在谁的手里,怎么去使用它。

    上面对比来看,貌似python比lua效率高很多,然而,我们本不该在lua里面执行大体积二进制文件的位操作,Lua作为C的触手,应该在C里面绑定一个方法让lua调用,这样lua的效率就是C的效率(当然,要扣除一点调用C的成本)。

    lua和python在不同场合有着各自的生命力。

    展开全文
  • 64位操作系统运行由32位操作系统生成的C/C++可执行文件时,会出现No such file or directory的错误信息。 这是因为缺少32为的lib库文件导致的,只需执行如下两条安装命令即可: $sudo apt-get install lib32bz2-1.0 ...

    64位操作系统运行由32位操作系统生成的C/C++可执行文件时,会出现No such file or directory的错误信息。

    这是因为缺少32为的lib库文件导致的,只需执行如下两条安装命令即可:

    $sudo apt-get install lib32bz2-1.0
    $sudo apt-get install lib32stdc++6



    展开全文
  • 关于32位DLL文件在64位操作系统中无法注册办法 32位编译器下编写的接口文件,之前在32位XP系统下都是好用的,但电脑升级成64位的Win7\Win8系统后,再使用CMD环境进行注册时,提示错误,注册不成功。 1、首先...
    关于32位DLL文件在64位操作系统中无法注册办法


    32位编译器下编写的接口文件,之前在32位XP系统下都是好用的,但电脑升级成64位的Win7\Win8系统后,再使用CMD环境进行注册时,提示错误,注册不成功。
    1、首先通过资源管理器 进入C:\Windows\SysWOW64  (c为系统盘)
    2、找到CMD.exe 并右键选择“以管理员身份运行”;
    3、使用CD命令返回到刚才的目录: cd C:\Windows\SysWOW64 并按回车
    在命令行中输入:
    regsvr32 *.dll 并按回车;
    就可以完成DLL或者OCX文件的注册。


    该DLL文件所需要的文件也应该放到该目录中
    cmd.exe 必须用管理员权限方式运行

    必须使用 SysWOW64目录下的 CMD.exe


    ps

    手头一个项目有个右键菜单的,编译为64位可以注册成功,右键菜单显示该项,使用正常。

    但是如果编译成32位的,虽然也注册成功,但是系统的右键菜单没有显示,按照该文的使用32位的cmd进行注册,提示成功,但是查看系统右键菜单仍然没有该项。

    暂时记录,现在还处理不了。

    展开全文
  • 在64位操作系统上安装32位bin文件,可以执行如下操作。 sudo apt-get install ia32-libs sudo apt -get update

    在64位操作系统上安装32位bin文件,可以执行如下操作。

    sudo apt-get install ia32-libs

    sudo apt -get update


    展开全文
  • 基于(Bit)的文件操作读写类

    千次阅读 2015-12-22 21:54:57
    C++ 文件读写 位操作
  • 摘自:http://topic.csdn.net/t/20020630/16/839385.htmlWINAPI中还有一组32程序专用的文件操作函数,这也是M$推荐使用的函数,但我还是推荐使用BCB的库函数,除非功能不足,由于此类函数众多,我就只对重要的作...
  • 我在windows 64位操作系统下,读写ini文件,存放于系统盘的%temp%目录下,但是老师崩溃的。 WritePrivateProfileString("Section1", "SecondKey","By golly, it works!",%temp%目录); 我查看msdn,说是要...
  • 64位操作系统编译成32位可执行文件

    千次阅读 2015-04-16 18:59:55
    sudo apt-get install lib32readline-gplv2-dev 然后 编译时加上 -m32 如:gcc a.c -m32
  • 数据文件加密算法—位操作加密法

    千次阅读 2005-10-30 00:51:00
    数据文件加密算法—位操作加密法数据文件加密算法—位操作加密法#includemain(int argc,char *argv[]){FILE *fp1,*fp2;int ch,flag=0;char key;if ((toupper (*argv[3])==E)|| (toupper(*argv[3])==D))flag=1;if (...
  • Lecture 10 文件操作

    2020-02-26 13:51:36
    C语言 文件操作运算
  • 说明:我将debug和汇编源程序都放入了E盘的huibianprogram文件夹中我已有的软件:DOS Box 0.74以及MASM615首先,进入cmd中,移动到debug和汇编文件所在盘符,然后执行到上图基本上是不会出现问题的,但是接着我们...
  • 运维经–目录 32Linux 操作2G以上文件 增加编译选项-D _FILE_OFFSET_BITS=64 open函数加O_LARGEFILE fd = open("./bill_test",O_LARGEFILE|O_APPEND|O_RDWR,0666);
  • 首先尝试的是RODBC,不过过程相当不顺利 我电脑上安装的是office 2003,ODBC数据源里面找不到excel的驱动程序 原因是office是32为版本,安装的驱动程序无法在64的win7上使用。 运行c:\windows\sysWOW64\odbcad3 …...
  • installshield 32打包和64打包的注意事项 32/64问题要把握几点: 1. 明确你的产品是否需要区分32/64 2. 明确你的产品中是否有32/64的服务注册 3. 了解InstallShield Build出来的安装包本身是32...
  • #include &lt;sys/types.h&gt; #include &lt;sys/stat.h&gt; #include &lt;fcntl.h&gt; #include &...//打开文件 int my_open(const char *pathname,int flags,mode_t mode...
  • 在Windows7 64位操作系统下,VisualStudio编译32位应用,调用CreateProcess运行System32文件夹下批处理文件会失败,GetLastError返回值是2。查询Error Lookup返回信息:系统找不到指定文件。 其原因在于64为操作...
  • 文件出错检测主要依靠流对象标志来检测: ios::eofbit 当遇到输入流尾部时,设置该。即打开文件进行读操作,当文件进行到尾部时,结束。 ios::failbit 当操作失败时,设置该。例如文件没有数据时还要进行读...
  • 为了检测 exe、dll、ocx 等类型的文件是 32 还是 64 ,网上有文章推荐使用 EXE 64bit Detector 之类的工具软件。EXE 64bit Detector 的官网是:http://securityxploded.com/exe-64bit-detector.php ,使用 EXE ...
  • java文件操作

    千次阅读 2018-02-02 21:59:14
    计算机中都是二进制数据,一个字节是8个2进制.字节可以表示所有的数据,比如文本,音频,视频.图片,都是作为字节存在的.也就是说字节流处理的数据非常多。 在文本文件中存储的数据是以我们能读懂的方式表示的。而在二...
  • win7 64位操作系统 丢失msvcrtd.dll文件

    千次阅读 2013-04-22 20:10:06
    测试通过 ...1、选择菜单build->Set Active Configuration,然后选择Release, ...其实这就是生成了发布版程序,在Release目录下,可执行文件不会用到那两个讨厌的dll文件,这样在其他机器上也能用了
  • 原子位操作

    千次阅读 2012-10-07 18:19:22
    原子位操作定义在文件中。令人感到奇怪的是位操作函数是对普通的内存地址进行操作的。原子位操作在多数情况下是对一个字长的内存访问,因而位号该位于0-31之间(在64位机器上是0-63之间),但是对位号的范围没有限制。 ...
  • Linux 文件 权限 操作

    千次阅读 2018-02-03 16:58:16
    一、权限简介 r :读权限 w:写权限 x:执行权限 ls -la -rw-r--r--....权限第二组:r--(读权限) 文件拥有组(用户组)权限 用户组队文件有什么权限 用户组里的用户对文件就有什么权限 权限第三组:r
  • 自 ... ...1、包含所有头文件以前,先定义这些宏: ...2、使用open打开文件的时候,加上O_LARGEFILE...5、为了保险,建议所有操作文件的函数都是用支持64文件的。否则当文件超过2G后,难免会出现什么未知的异常
  • 现象:在Windows7 64位操作系统下,读取system32下的文件失败,提示“系统找不到指定文件”。原因:在Windows7 64位操作系统下,VisualStudio编译32位应用,调用CreateProcess运行System32文件夹下批处理文件会失败...
  • Linux 文件和文件夹权限操作

    万次阅读 多人点赞 2018-04-10 17:45:23
    三、Linux 文件权限首先来查看一下当前目录下的文件内容吧ls -l 查看当前目录下的文件列表 ls -l xxx.xxx (xxx.xxx是文件名) 查看指定的文件我们可以看到文件的权限,-rw-rw-r-- ,一共有10位数。其中: 最前面...
  • Linux-文件权限操作

    2016-06-21 14:05:57
    文件权限讲解:在linux/unix使用中总会涉及到一些文件可以进行操作或执行,而有一些文件却不能进行操作或执行,那么对这个文件肯定就有一个标识,来指定文件操作权限。 在Linux中是通过如下表示来代表文件权限的:...
  • 费尽周折,上图:一开始以为是下载过程中文件出错,然后下载了好多次,每次点击安装和的时候,都会出现下面的错误提示:可是机器的操作系统版本就是win7 64位操作系统,下载的git版本也是for windows-64位的,到底是...
  • ArcGIS Desktop9.3的新特性说明是支持64计算机的,但是,在业主的服务器(64)中安装两次都没有成功,无功而返。今天在我们这里的64机器上成功安装了破解包,一阵兴奋~~  走完整个安装过程,双击注册文件,...
  • 我是要在浏览器客户端使用url protocol打开本地exe时候,因为传参问题,考虑到用修改注册表方式完成。 结果:行不通。...java操作注册表需要2个文件 (①. regeditry.jar ②.需要将dll文件放到tom...
  • 平时经常需要qt实现文件读取,每次都是直接百度需求,这里整理下用过的文件相关操作 平时主要参考这两博客,有需求直接搜索,只要他们写过,问题一定很好解决( https://blog.csdn.net/feiyangqingyun 刘大神 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,527
精华内容 7,410
关键字:

文件位操作