精华内容
下载资源
问答
  • python 内存二进制读取图片
    千次阅读
    2017-09-12 20:33:41



    @csrf_exempt
    def handle_upload(request):
        print("***************************")
        file_obj = request.FILES.get('file')
        if file_obj:   # 处理附件上传到方法
            request_set = {}
            print('file--obj', file_obj)
            # user_home_dir = "upload/%s" % (request.user.userprofile.id)
            accessory_dir = settings.accessory_dir
            if not os.path.isdir(accessory_dir):
                os.mkdir(accessory_dir)
    
            scr = Image.open(file_obj)
            img= np.asarray(scr)

    更多相关内容
  • 查看浮点数float 在内存二进制数,可以验证自己所计算的float数的二进制数是否正确。 查看浮点数float 在内存二进制数,可以验证自己所计算的float数的二进制数是否正确。
  • 在类型化数组出现之前,我们是无法直接通过 JavaScript 操作二进制数据,通常都是操作 JavaScript 中的数据类型,由运行时转化成二进制。这就多了一个转化的过程,尽管 JavaScript 对数据类型做了很多优化以提高效率...
  • 已知一个只包含0和1的二进制数,长度不大于10,将其转换为十进制并输出。 输入描述 输入一个二进制整数n,其长度不大于10 输出描述 输出转换后的十进制数,占一行 样例输入 110 样例输出 6 solution:  很多学过C...
  • 用c语言将二进制执行文件读到缓冲区当中,并打印出PE结构信息
  • BinProtect提出了一种工具,该工具能够转换二进制形式的程序(ELF32),以追溯地合并在编译时尚未集成的安全性机制。 受编译时保护机制的启发,BinProtect集成了以下四种简短描述的四种安全强化措施: BinProtect...
  • 之前介绍了本人研究如何使用TCL脚本来存取二进制文件,这是因为我们在具体项目中实际使用得到,今天就给大家介绍下如何使用。
  • 探讨了采用前沿的动态二进制分析技术检测软件中与内存相关错误,为程序员定位错误位置、查找错误、消除错误原因提供准确的信息的方法,为致力于内存程序错误检测技术的研究人员提供参考。在C/C++软件中的内存错误...
  • E9Patch - 强大的静态二进制重写器 E9Patch 是一个强大的静态二进制重写工具,用于x86_64 Linux ELF 二进制文件。 E9补丁是: 可扩展:E9Patch 可以可靠地重写大型/复杂的二进制文件,包括 Web 浏览器(大小超过 ...
  • Sojobo-二进制分析框架 Sojobo是框架的仿真器。 创建该文件是为了简化对潜在恶意文件的分析。 它是完全在.NET中开发的,因此您无需安装或编译任何其他外部库(该项目是自包含的)。 使用Sojobo,您可以: 模拟(32...
  • # 利用python在内存中读写str和二进制数据 from io import StringIO from io import BytesIO f = StringIO() print(f.write('hello ')) # 6 print(f.write('world!')) # 6 print(f.getvalue()) # hello world! f = ...
  • 精彩编程与编程技巧-将数据转换为内存二进制形式字符串 ...
  • 在很多应用中,经常会直接把图片的二进制数据进行交换,比如说利用 socket 通信传送图片二进制数据,或者直接用内存数据库(例如 Redis)来传递图片二进制数据。 这个时候,当你的应用程序读到内存里的二进制图片...

          想了多种方法解决这个问题,还是百度的力量大。

           在很多应用中,经常会直接把图片的二进制数据进行交换,比如说利用 socket 通信传送图片二进制数据,或者直接用内存数据库(例如 Redis)来传递图片二进制数据。

           这个时候,当你的应用程序读到内存里的二进制图片数据时,怎么样直接转为 OpenCV 可以使用的图片格式呢,答案是用 cv::imdecode 这个函数。

           即先构造一个 char 字符串序列的 vector,用来存储图片的二进制数据,然后再转为 cv::Mat 成为可以被 cv::imdecode 使用的数据格式,然后直接类型转换为 IplImage 数据格式。

           同样,如果你需要把 IplImage 或 cv::Mat 压缩并写到一段内存块里时,就需要使用 cv::imencode 这个函数,使用方法类似。

    具体的实现代码参考:

    string fname = "D:/image.jpg";
        //! 以二进制流方式读取图片到内存
        FILE* pFile = fopen(fname.c_str(), "rb");
        fseek(pFile, 0, SEEK_END);
        long lSize = ftell(pFile);
        rewind(pFile);
        char* pData = new char[lSize];
        fread(pData, sizeof(char), lSize, pFile);
        fclose(pFile);
    
        //! 解码内存数据,变成cv::Mat数据
        cv::Mat img_decode;
        vector<uchar> data;
        for (int i = 0; i < lSize; ++i){
            data.push_back(pData[i]);
        }
        img_decode = cv::imdecode(data, CV_LOAD_IMAGE_COLOR);
        cv::flip(img_decode, img_decode, -1);
        img_decode.channels();
    
        //! 将cv::Mat数据编码成数据流
        vector<unsigned char> img_encode;
        cv::imencode(".jpg", img_decode, img_encode);
        unsigned char *encode_data = new unsigned char[lSize];
        for (int i = 0; i<lSize; i++){
            encode_data[i] = img_encode[i];
        }

    如果需要解码的图像格式特殊,如unit16的深度图,请在调用imdecode时选择CV_LOAD_IMAGE_UNCHANGED 

    Specific color type of the loaded image:
    CV_LOAD_IMAGE_COLOR the loaded image is forced to be a 3-channel color image
    CV_LOAD_IMAGE_GRAYSCALE the loaded image is forced to be grayscale
    CV_LOAD_IMAGE_UNCHANGED the loaded image will be loaded as is.

     

    展开全文
  • 主要介绍了asp.net实现图片以二进制流输出的两种方法,以简单实例形式分析了asp.net实现以二进制流形式读写图片文件的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • 虽然大多数linux爱好者都不怎么使用Windows,但是不少人还是习惯了某些Windows下的软件,而不愿意从开源仓库中寻找替代品。当然,你可以用拥有Wine的GNU/Linux系统解决这个问题。但是还有令人感觉不如意的地方:每次...
  • Java读取和写入二进制大文件的方法,应该说是一个基于二进制的大文件块,演示了如何自定义缓存区,并使用不具有缓冲功能的DataInputStream 和DataOutputStream 类来读写二进制的大文件块数据,运行效果请参见如下...
  • 之前写了一篇关于win平台下,从内存执行二进制码的文章,所以此文主要修改自那篇。 大家可能会很好奇,我们的任意程序,不就是在内存中执行的二进制机器码吗? 不,今天我要说的是,我们如何把实现指定功能的一段...

    之前写了一篇关于win平台下,从内存执行二进制码的文章,所以此文主要修改自那篇。

    大家可能会很好奇,我们的任意程序,不就是在内存中执行的二进制机器码吗?

    不,今天我要说的是,我们如何把实现指定功能的一段二进制机器码,放到我们的程序中,然后在需要的时候,直接调用它。

    当然,这段代码也有其他用途,故而有了shell code的昵称,参考百度百科:

    https://baike.baidu.com/item/shellcode/4051847?fr=aladdin

    思考:
    我们需要解决以下问题

    • 二进制代码从哪里来?
    • c/c++中如何调用它?

    这些问题,接下来,都会得到解决。
    不过,我们先来看看效果。

    一、执行二进制代码效果

    main.c:

    #include <stdio.h>
    #include <string.h>
    #include <sys/mman.h>
    
    typedef int(*AddFunc)(int, int);
    
    int main() 
    {
        // int add(int a, int b)函数64位系统下二进制码
    	unsigned char add_binaryCode[] = {
    		0x55,
    		0x48, 0x89, 0xe5,
    		0x89, 0x7d, 0xfc,
    		0x89, 0x75, 0xf8,
    		0x8b, 0x55, 0xfc,
    		0x8b, 0x45, 0xf8,
    		0x01, 0xd0,
    		0x5d,
    		0xc3
    	};
    
    	// 申请EXECUTE属性内存
    	void* execBuf = mmap(NULL, sizeof(add_binaryCode), PROT_WRITE | PROT_EXEC,MAP_ANON | MAP_PRIVATE, -1, 0);
    
    	// 拷贝二进制码
    	memcpy(execBuf, add_binaryCode, sizeof(add_binaryCode));
    
    	// 执行二进制码
    	AddFunc func = (AddFunc)execBuf;
    	int ret = func(1, 2);
    	printf("result:%d\n", ret);
    
    	// 释放内存
    	munmap(execBuf, sizeof(add_binaryCode));
    	return 0;
    }
    

    Ubuntu环境64位下编译执行

    gcc main.c -o main.out
    ./main.out
    

    add_binaryCode中装的是add函数二进制码,C函数形式如下:

    int add(int a, int b)
    {
    	return a + b;
    }
    

    我们不能在数组中执行二进制码,这样会报异常,故需要申请带可执行属性的内存,然后拷贝到其中,强转类型后,调用此函数。

    运行结果:

    在这里插入图片描述

    运行结果正确,且没有报异常。

    小结:

    我们可以把逻辑代码封装为函数,并转换为二进制码,然后在c/c++中进行调用执行。

    到此我们解决了,在c/c++中如何执行二进制码的问题。

    接下来,我们来解决二进制码如何生成的问题。

    二、二进制代码的生成

    个人认为有2种方式生成二进制码

    1.纯手写十六进制机器码

    2.采用c/c++等高级语言编写程序,编译后,对其反汇编进而获得十六进制机器码

    第一种,好比回到了纸带打孔编程的石器时代,需要了解x86指令集及其对应机器码,能力有限,直接放弃。

    接下来,采用第二种方式,大概讲下,怎么通过自己写的函数,去提取生成的二进制码。

    1. 编写add测试函数

    add.c:

    int add(int a, int b)
    {
    	return a + b;
    }
    

    2. 编译,生成*.o文件

    gcc -c add.c -o add.o
    

    3. 提取add函数二进制码

    objdump -j .text -d add.o
    

    每行":"后面的十六进制数字就是机器码。如下:

    在这里插入图片描述

    故,我们把这些机器码拷贝出来,放到数组中

    unsigned char add_binaryCode[] = {
    	0x55,
    	0x48, 0x89, 0xe5,
    	0x89, 0x7d, 0xfc,
    	0x89, 0x75, 0xf8,
    	0x8b, 0x55, 0xfc,
    	0x8b, 0x45, 0xf8,
    	0x01, 0xd0,
    	0x5d,
    	0xc3
    };
    

    这些机器码就是我们add函数编译后生成的二进制码,即最终在内存中,cpu执行的机器码。我们让这个数组按照第一节中的方式,就可以在c/c++代码中进行调用执行了。

    三、从文件中读取二进制码并执行

    似乎本节的意义并不大,无非就是读取出来,放到buffer中,再执行罢了,主要的执行原理、二进制码生成都已经讲完了,这个就留给大家自行扩展吧。

    四、总结

    机器码的获取,比较关键的就是objdump这条命令。

    另外执行时,比较关键的是,需要把机器码放到mmap指向的内存中去,不能在普通内存中执行。

    参考链接:

    《执行机器码》



    若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!

    同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。

    本文涉及工程代码,公众号回复:08ExecBinaryFromBuffer_linux,即可下载。

    在这里插入图片描述

    展开全文
  • 二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。 ...
  • 二进制文件流读写-C++ IO流

    千次阅读 2020-06-11 21:56:58
    二进制文件流读写-C++ 为什么要用二进制写文件 计算机在物理上的存储是以二进制方式存储的,那么文本文件与二进制文件的区别就是物理存储上的吗? 不,而是逻辑上的,这两者只是在编码层次上有差异,文本文件是基于...

    二进制文件流读写-C++

    为什么要用二进制写文件

    计算机在物理上的存储是以二进制方式存储的,那么文本文件与二进制文件的区别就是物理存储上的吗?

    不,而是逻辑上的,这两者只是在编码层次上有差异,文本文件是基于字符编码的文件,常见编码有ascll编码,unicode编码等,二进制文件是基于值编码的文件,可以根据应用,指定某个值是什么意思(这样一个过程可以看作是自定义编码);

    文本文件基本上是定长编码的,基于字符,每个字符在具体编码中是固定的,ascll码是特定的编码,而二进制可以看作是变长编码

    第一:

    使用二进制文件比较节约空间,比如在存储数字,特别实型数字时,二进制更节省空间

    第二:

    计算机物理内存中都是用二进制无格式存储起来的,所以二进制存储到文件就更快捷,如果存储为文本文件时,需要转换的过程,所以在数据量很大时,两者的差别就会体现出来

    第三:

    一些比较精确的数据,使用二进制存储不会造成有效位丢失.

    文本文件与二进制文件的区别:

    • 写入数字 1,实际写入的是 字符 '1'

    • 二进制文件:写数字1,实际写入的是整数 1 ;

    • 1的二进制是0001 (所占4个字节,最低是1, 追高3个字节都是0);

      写入二进制文件

      使用文件流对象的write方法写入二进制数据.

      • 演示

        输出入一个整数:

      • 读二进制文件

        使用文件流的read方法.

        • 演示

        • 输出结果为:

        • 更多技术交流欢迎来到~奇牛

    展开全文
  • redis存储二进制数据测试代码
  • C语言把浮点数转换为二进制数的方法和示例

    千次阅读 多人点赞 2020-04-25 16:41:53
    浮点数据转换为二进制的方法是: 1)把浮点数拆分成两部分,小数点前面的整数和小数点后面的小数。 2)分别把整数和小数部分转换为二进制,保存在字符串中。 3)输出转换后和二进制字符串。 1、整数部分转二进制字符...
  • floatbin浮点数的二进制/16进制表示转换工具(附带源代码) 很实用,代码也值得参考
  • k3s - 轻量级Kubernetes, 易于安装,内存减半,所有二进制文件都小于40mb
  • 1MB=1024KB=2^10KB ...按照这个运算逻辑,1M字节内存,地址编码应该需要23位二进制位。 但是因为内存中字节是最小的寻址单位,无法寻址到bit。所以此处的“位”指的是多少“位”字节,而不是多少“位”比特。 ...
  • 二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。 ...
  • 010 Editor 是一款很好用的编辑器,其中有一个很好的特点是可以运行模板文件来分析二进制文件。查看和编辑硬盘驱动器上的任何二进制文件(文件大小无限制)和文本文件,包括Unicode文件,C / C ++,XML,PHP等。 ...
  • 大家可能会很好奇,我们的任意exe程序,不就是在内存中执行的二进制机器码吗? 不,今天我要说的是,我们如何把实现指定功能的一段二进制机器码,放到我们的程序中,然后在需要的时候,直接调用它。 当然,这段代码...
  • C_图片转换成二进制流并且保存到sql_server数据库,或者存储。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 652,228
精华内容 260,891
关键字:

内存二进制