图片转二进制python
Ⅰ 关于python如何实现各进制转换的总结大全
ctf经常遇到进制转换的问题,就正好做一个进制转换总结,分享出来供大家参考学习,下面来一起看看详细的介绍:
字符串与十六进制转换
例如网络ctf 12月的第二场第一个misc
?
1
626536377D
比较简单的一种做法就是直接调用字符串的.decode('hex')解密即可, 但如果不用这个函数你会怎么解呢?
一种思路就是先2个分组,解出每组的ascii值,合并下字符串即可得到,具体代码如下
?
1234567
import res='626536377D's = re.findall(r'.{2}',s)s = map(lambda x:chr(int(x,16)),s)print ''.join(s)>>>flag{ec8b2ee0-3ae9-4c21-a012-08aa5fa7be67}
前面说了字符串的decode('hex')函数,另外还有两个转16进制的函数,这里都总结一下
内置函数hex()
只能转换10进制整数为十六进制,不能转字符串
binascii库的hexlify()和b2a_hex()
这两个函数的功能是将字符串转换成十六进制,对应的解密函数分别为 unhexlify()和a2b_hex()
进制互转
二进制,八进制,十六进制转10进制比较简单,直接调用
int函数
?
1
int(str,base) //返回十进制整数,但注意此时第一个参数为字符串
对应的解密函数分别是
?
12345
bin() //10进制转二进制 oct() //十进制转八进制 hex() //十进制转十六进制
但二进制直接转16进制就需要多走一步了,先用int转十进制,在用上面提到的hex()函数将十进制转换成十六进制,比较精简的写法是
?
1
map(lambda x:hex(int(x,2)),['0011']) //lambda表达式
或者是
?
1
[hex(int(x,2)) for x in ['0011']] //列表解析
对应的解密函数就是
?
1
map(lambda x:bin(int(x,16)),['ef'])
最后在附上自己用python写的一个进制转换小工具,主要功能是对一组二进制,或者ascii,或十六进制转换成字符串,想必ctf上也经常会遇到这类题型吧
?
041424344
# make by 江sir#coding:utf-8import reimport argparse def bintostr(text): text = text.replace(' ','') text = re.findall(r'.{8}',text) s = map(lambda x:chr(int(x,2)),text) #批量二进制转十进制 flag = ''.join(s) return flag def asciitostr(text): if ' ' in text: text = text.split(' ') elif ',' in text: text = text.split(',') s = map(lambda x:chr(int(x)),text) flag = ''.join(s) return flag def hextostr(text): text = re.findall(r'.{2}',text) #print text s = map(lambda x:chr(int(x,16)),text) #print s flag = ''.join(s) return flag if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument("-b") parser.add_argument("-a") parser.add_argument("-x") argv = parser.parse_args() #print argv if argv.b: res = bintostr(argv.b) elif argv.a: res = asciitostr(argv.a) elif argv.x: res = hextostr(argv.x) print res
用法:
十六进制转字符串:
626536377D
?
12
bintostr.py -x "626536377D"flag{ec8b2ee0-3ae9-4c21-a012-08aa5fa7be67}
二进制转字符串:
可以有空格,也可以无空格
00101111 01100110 00110110 00110111 00110011 00110010 00110100 00110001 00110000 01100001 01100001 01100100 01100011 00110000 00110011 00110111 01100110 01100010 00110000 01100011 01100010 01100001 01100001 00110000 00110000 01100011 00110111 00110101 00110011 00110001 00110011 00110111 00110011 00101110 01110100 01111000 01110100
?
12
bintostr.py -b "00101111 01100110 00110110 00110111 00110011 00110010 00110100 00110001 00110000 01100001 01100001 01100100 01100011 00110000 00110011 00110111 01100110 01100010 00110000 01100011 01100010 01100001 01100001 00110000 00110000 01100011 00110111 00110101 00110011 00110001 00110011 00110111 00110011 00101110 01110100 01111000 01110100"/.txt
ascii转字符串
可以是空格分隔,也可以是,分隔
s='45 46 45 46 32 45 32 46 46 45 46 32 46 45 46 46 32 46 46 46 32 45 46 46 46 32 46 46 45 45 46 45 32 45 46 46 46 32 46 46 46 32 46 45 46 46 32'
?
12
bintostr.py -a "45 46 45 46 32 45 32 46 46 45 46 32 46 45 46 46 32 46 46 46 32 45 46 46 46 32 46 46 45 45 46 45 32 45 46 46 46 32 46 46 46 32 46 45 46 46 32"-.-. - ..-. .-.. ... -... ..--.- -... ... .-..
以上实例均来自某些ctf赛题
总结
Ⅱ 怎么把JPG格式图片转化成二进制数据。
作为2二进制文件打开,一个字节一个字节地读入,写出,直到EOF(文件结束符)。当然写出时要按数据库约定的方式。
下面作为普通文件输出
FILE *fin,*fout;
void main(){int c;fin=fopen( ck.jpg,rb); // 作为2二进制文件打开
fout=fopen(tmp.jpg,wb);while(1){c=fgetc(fin); // 一个字节一个字节地读入
fputc ( c , fout ); // 改此句,让它符合数据库约定。}}
Ⅲ 图片能转成2进制的代码吗
可以转的,可以把图片序列化哼二进字节数组,也可以把二进制字节数组反序列化为图片。使用BinaryFormatter类来操作,图片质量不会有损失。 给你个示例。
/// <summary>
/// 把对象序列化并返回相应的字节
/// </summary>
/// <param name="pObj">需要序列化的对象</param>
/// <returns>byte[]</returns>
public byte[] SerializeObject(object pObj)
{
if (pObj == null)
return null;
System.IO.MemoryStream _memory = new System.IO.MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(_memory, pObj);
_memory.Position = 0;
byte[] read = new byte[_memory.Length];
_memory.Read(read, 0, read.Length);
_memory.Close();
return read;
}
/// <summary>
/// 把字节反序列化成相应的对象
/// </summary>
/// <param name="pBytes">字节流</param>
/// <returns>object</returns>
public object DeserializeObject(byte[] pBytes)
{
object _newOjb = null;
if (pBytes == null)
return _newOjb;
System.IO.MemoryStream _memory = new System.IO.MemoryStream(pBytes);
_memory.Position = 0;
BinaryFormatter formatter = new BinaryFormatter();
_newOjb = formatter.Deserialize(_memory);
_memory.Close();
return _newOjb;
}
Ⅳ Python中读取二进制图片(例如 a.jpg)有关解码编码的问题
binascii.hexlify估计能满足你的要求。不过不建议把二进制数据用编解码来处理,因为编解码只是文本采用了不同的编码方案。而图像这些二进制有自己的含义,文本编解码方案不应该用在这些二进制文件上。s就是你的数据,你也别想看懂,除非你知道jpg格式。
Ⅳ 图像二进制原理 图像二进制化是如何进行的
1、二进制图片是指图片是二进制文件,图片保存在磁盘是二进制文件。实际就是称作文本文件。它在磁盘保存时也是一种二进制文件。计算机的存储在物理上是都二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。
2、通过分割从彩色图像生成二进制图像。分割是将源图像中的每个像素分配给两个或更多个类的过程。如果有两个以上的类,则通常的结果是几个二进制图像。最简单的分割方式可能是基于灰度强度将像素分配给前景或背景。
3、基本思路是在图片文件以二进制流的方式读入到计算机中后,将该二进制流转换为字符串,即“图片字符串”,最后保存到XML文档中。显示时,则将XML文档中的“图片字符串”转换为二进制流,并用可视组件(如web网页中的 组件)进行显示。
Ⅵ 如何将图片转换成二进制存储
资源简介图片的常见存储与读取凡是有以下几种:存储图片:以二进制的形式存储图片时,要把数据库中的字段设置为Image数据类型(SQL Server),存储的数据是Byte[].1.参数是图片路径:返回Byte[]类型: public byte[] GetPictureData(string imagepath) { /**/////根据图片文件的路径使用文件流打开,并保存为byte[] FileStream fs = new FileStream(imagepath, FileMode.Open);//可以是其他重载方法 byte[] byData = new byte[fs.Length]; fs.Read(byData, 0, byData.Length); fs.Close(); return byData; }2.参数类型是Image对象,返回Byte[]类型: public byte[] PhotoImageInsert(System.Drawing.Image imgPhoto) { //将Image转换成流数据,并保存为byte[] MemoryStream mstream = new MemoryStream(); imgPhoto.Save(mstream, System.Drawing.Imaging.ImageFormat.Bmp); byte[] byData = new Byte[mstream.Length]; mstream.Position = 0; mstream.Read(byData, 0, byData.Length); mstream.Close(); return byData; }好了,这样通过上面的方法就可以把图片转换成Byte[]对象,然后就把这个对象保存到数据库中去就实现了把图片的二进制格式保存到数据库中去了。下面我就谈谈如何把数据库中的图片读取出来,实际上这是一个相反的过程。读取图片:把相应的字段转换成Byte[]即:Byte[] bt=(Byte[])XXXX1.参数是Byte[]类型,返回值是Image对象: public System.Drawing.Image ReturnPhoto(byte[] streamByte) { System.IO.MemoryStream ms = new System.IO.MemoryStream(streamByte); System.Drawing.Image img = System.Drawing.Image.FromStream(ms); return img; }2.参数是Byte[] 类型,没有返回值,这是针对asp.net中把图片从输出到网页上(Response.BinaryWrite) public void WritePhoto(byte[] streamByte) { // Response.ContentType 的默认值为默认值为“text/html” Response.ContentType = "image/GIF"; //图片输出的类型有: image/GIF image/JPEG Response.BinaryWrite(streamByte); }补充:针对Response.ContentType的值,除了针对图片的类型外,还有其他的类型: Response.ContentType = "application/msword"; Response.ContentType = "application/x-shockwave-flash"; Response.ContentType = "application/vnd.ms-excel";另外可以针对不同的格式,用不同的输出类型以适合不同的类型: switch (dataread("document_type")) { case "doc": Response.ContentType = "application/msword"; case "swf": Response.ContentType = "application/x-shockwave-flash"; case "xls": Response.ContentType = "application/vnd.ms-excel"; case "gif": Response.ContentType = "image/gif"; case "Jpg": Response.ContentType = "image/jpeg"; }立即获得您的.
Ⅶ 怎么将图片转换成二进制,存入数据库,然后怎么读出来并显示
1.将Image图像文件存入到数据库中
我们知道数据库里的Image类型的数据是"二进制数据",因此必须将图像文件转换成字节数组才能存入数据库中.
要这里有关数据的操作略写,我将一些代码段写成方法,方便直接调用.
//根据文件名(完全路径)
public byte[] SetImageToByteArray(string fileName)
{
FileStream fs = new FileStream(fileName, FileMode.Open);
int streamLength = (int)fs.Length;
byte[] image = new byte[streamLength];
fs.Read(image, 0, streamLength);
fs.Close();
return image;
}
//另外,在ASP.NET中通过FileUpload控件得到的图像文件可以通过以下方法
public byte[] SetImageToByteArray(FileUpload FileUpload1)
{
Stream stream = FileUpload1.PostedFile.InputStream;
byte[] photo = new byte[FileUpload1.PostedFile.ContentLength];
stream.Read(photo, 0, FileUpload1.PostedFile.ContentLength);
stream.Close();
return photo;
}
2.从SQL Server数据库读取Image类型的数据,并转换成bytes[]或Image图像文件
//要使用SqlDataReader要加载using System.Data.SqlClient命名空间
//将数据库中的Image类型转换成byte[]
public byte[] SetImage(SqlDataReader reader)
{
return (byte[])reader["Image"];//Image为数据库中存放Image类型字段
}
//将byte[]转换成Image图像类型
//加载以下命名空间using System.Drawing;/using System.IO;
using System.Data.SqlClient;*/
public Image SetByteToImage(byte[] mybyte)
{
Image image;
MemoryStream mymemorystream = new MemoryStream(mybyte,0, mybyte.Length);
image = Image.FromStream(mymemorystream);
return image;
}
Ⅷ python整数转化为二进制
1、你可以自己写函数采用 %2 的方式来算。
>>> binary = lambda n: '' if n==0 else binary(n/2) + str(n%2)>>> binary(5)'101'>>>
2、采用 python 自带了方法 bin 函数,比如 bin(12345) 回返回字符串 '0b11000000111001', 这个时候在把0b去掉即可:
>>> bin(12345).replace('0b','')'11000000111001'
3、也可以采用字符串的 format 方法来获取二进制:
>>> "{0:b}".format(12345)'11000000111001'>>>
Ⅸ 如何用python读取图片的16进制码
你可以直接用open('test.bmp','rb') open函数打开,这样得到的是二进制数据,然后你根据图片格式的相应说明对二进制数据进行相应的转换即可,或者使用图像处理库来做也是很方便的,比如opencv等等。