python 字节流中字节流可以拼接吗

11:27 提问
python中的类型怎么对应java中的byte[]
场景是这个样子的,我这边要实现一个接口, 服务器端是java做的,客户端是python做的,服务器端向客户端提供了一个login的接口,需要客户端实现,login需要给服务器返回一个byte[] 的值 ,但是python中貌似没有byte这个类型,我该怎么处理?
bytearray 这个方法试过了 貌似不行
在线等好心人
求大神给我点一下啊 卡到这里很长时间了,很紧 啊
按赞数排序
正确答案 已经试过 成功
感谢开源社区 感谢 华为 刘峥
import base64
Some useful functions for interacting with Java web services from Python.
def make_file_java_byte_array_compatible(file_obj):
Reads in a file and converts it to a format accepted as Java byte array
:param file object
:return string
encoded_data = base64.b64encode(file_obj.read())
print encoded_data
for i in xrange((len(encoded_data)/40)+1):
strg += encoded_data[i*40:(i+1)*40]
return strg
def java_byte_array_to_binary(file_obj):
Converts a java byte array to a binary stream
:param java byte array as string (pass in as a file like object, can use StringIO)
:return binary string
decoded_data = base64.b64decode(file_obj.read())
for i in xrange((len(decoded_data)/40)+1):
strg += decoded_data[i*40:(i+1)*40]
return strg
bytearray是将字符串在内存中的存储转化为数组,而不是它的字面值。
比如 "1A" 转化出来是2个字节,而不是字面值的一个字节。
python无需定义类型,直接接收就可以了。
关于python字节流,参考:
python的这种技术也不怎么懂
这里是一些资料 希望对楼主有用啊
lz值得赞一个,不但解决了问题,而且分享了解决方案。
其他相似问题Python中对字节流/二进制流的操作:struct模块简易使用教程 - 简书
<div class="fixed-btn note-fixed-download" data-toggle="popover" data-placement="left" data-html="true" data-trigger="hover" data-content=''>
写了10571字,被29人关注,获得了38个喜欢
Python中对字节流/二进制流的操作:struct模块简易使用教程
前段时间使用Python解析IDX文件格式的MNIST数据集,需要对二进制文件进行读取操作,其中我使用的是struct模块。查了网上挺多教程都写的挺好的,不过对新手不是很友好,所以我重新整理了一些笔记以供快速上手。
注:教程中以下四个名词同义:二进制流、二进制数组、字节流、字节数组
在struct模块中,将一个整型数字、浮点型数字或字符流(字符数组)转换为字节流(字节数组)时,需要使用格式化字符串fmt告诉struct模块被转换的对象是什么类型,比如整型数字是'i',浮点型数字是'f',一个ascii码字符是's'。
def demo1():
# 使用bin_buf = struct.pack(fmt, buf)将buf为二进制数组bin_buf
# 使用buf = struct.unpack(fmt, bin_buf)将bin_buf二进制数组反转换回buf
# 整型数 -& 二进制流
buf1 = 256
bin_buf1 = struct.pack('i', buf1) # 'i'代表'integer'
ret1 = struct.unpack('i', bin_buf1)
print bin_buf1, '
# 浮点数 -& 二进制流
buf2 = 3.1415
bin_buf2 = struct.pack('d', buf2) # 'd'代表'double'
ret2 = struct.unpack('d', bin_buf2)
print bin_buf2, '
# 字符串 -& 二进制流
buf3 = 'Hello World'
bin_buf3 = struct.pack('11s', buf3) # '11s'代表长度为11的'string'字符数组
ret3 = struct.unpack('11s', bin_buf3)
print bin_buf3, '
# 结构体 -& 二进制流
# 假设有一个结构体
# struct header {
double buf2;
char buf3[11];
bin_buf_all = struct.pack('id11s', buf1, buf2, buf3)
ret_all = struct.unpack('id11s', bin_buf_all)
print bin_buf_all, '
', ret_all
输出结果如下:
demo1输出结果
详解struct模块
struct模块中最重要的三个函数是pack(), unpack(), calcsize()
# 按照给定的格式化字符串,把数据封装成字符串(实际上是类似于c结构体的字节流)
string = struct.pack(fmt, v1, v2, ...)
# 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple
tuple = unpack(fmt, string)
# 计算给定的格式(fmt)占用多少字节的内存
offset = calcsize(fmt)
struct中的格式化字符串
struct中支持的格式如下表:
string of length 1
signed char
unsigned char
unsigned short
unsigned int
integer or lon
unsigned long
unsigned long long
注1:q和Q只在机器支持64位操作时有意思注2:每个格式前可以有一个数字,表示个数注3:s格式表示一定长度的字符串,4s表示长度为4的字符串,但是p表示的是pascal字符串注4:P用来转换一个指针,其长度和机器字长相关注5:最后一个可以用来表示指针类型的,占4个字节
为了同c中的结构体交换数据,还要考虑有的c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下:
Byte order
Size and alignment
凑够4个字节
按原字节数
little-endian
按原字节数
big-endian
按原字节数
network (= big-endian)
按原字节数
使用方法是放在fmt的第一个位置,就像'@5s6sif'
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
如果你是程序员,或者有一颗喜欢写程序的心,喜欢分享技术干货、项目经验、程序员日常囧事等等,欢迎投稿《程序员》专题。
专题主编:小...
· 241528人关注
玩转简书的第一步,从这个专题开始。
想上首页热门榜么?好内容想被更多人看到么?来投稿吧!如果被拒也不要灰心哦~入选文章会进一个队...
· 142653人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:Python实现拼接多张图片的方法
投稿:shichen2014
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Python实现拼接多张图片的方法,以具体的实际应用引出Python拼接图片的思路并给出了实现的具体方法,需要的朋友可以参考下
本文实例讲述了Python实现拼接多张图片的方法。分享给大家供大家参考。具体分析如下:
这里所述计划实现如下操作:
① 用Latex写原始博文,生成PDF文档;
② 将PDF转成高清的PNG格式的图片;
③ 将多个PNG格式的图片合并成一大张图片;
④ 将最终的大图片直接上传到博文编辑器中
  好了,如果将PDF文档转换成其他的图片格式呢?我建议windowns下可用Adobe& Acrobat X Pro软件完成这个工作,操作步骤如下面两图所示。注意在图二中一定要自己指定一个分辨率,不用用自动的,否则生成的图片大小会有差异的。就我的多次尝试来看,分辨率设置得太大了,虽然图片放大后仍然很清晰,但是贴到博文中仍然需要不断地调整大小,选择“59.06像素/厘米”就非常合适了。需要注意的是,博客的主题要选那种供博文显示的页面比较宽的,否则贴图片上去也不怎么好看的。
  将PDF文档用Adobe Acrobat X Pro另存为图片后,就会在PDF文档所在的目录下生成一系列的名为“PDFfilename_页面_XX.png"的一系列图片。我们接下来的任务就是要将这些图片合并成一张图片。我选用了强大便捷的Python来完成这项任务。刚开始用matplotlib库来操作,可是最终发现matplotlib中的保存图片的函数(无论是Image.imsave()还是pyplot.imsave())都有一定的限制,那就是图片的长或宽都不能超过32768。这个限制让我很不满意,继续尝试其他的图像操作的库,最终发现PIL库不存在这个限制,问题也得到了解决。下面这段Python代码默认所有图片对应的顺序是文件名末尾序号的升序,序号可以不连续,能处理的图片名字必须是形如xx_1.png ... xx_100.png或者xx_001.png ... xx_100.png。最后短小精悍的Python代码如下:
代码如下:#!/usr/bin/python3
#encoding=utf-8
import numpy as np
from PIL import Image
import glob,os
if __name__=='__main__':
&&& prefix=input('Input the prefix of images:')
&&& files=glob.glob(prefix+'_*')
&&& num=len(files)
&&& filename_lens=[len(x) for x in files] #length of the files
&&& min_len=min(filename_lens) #minimal length of filenames
&&& max_len=max(filename_lens) #maximal length of filenames
&&& if min_len==max_len:#the last number of each filename has the same length
&&&&&&& files=sorted(files) #sort the files in ascending order
&&& else:#maybe the filenames are:x_0.png ... x_10.png ... x_100.png
&&&&&&& index=[0 for x in range(num)]
&&&&&&& for i in range(num):
&&&&&&&&&&& filename=files[i]
&&&&&&&&&&& start=filename.rfind('_')+1
&&&&&&&&&&& end=filename.rfind('.')
&&&&&&&&&&& file_no=int(filename[start:end])
&&&&&&&&&&& index[i]=file_no
&&&&&&& index=sorted(index)
&&&&&&& files=[prefix+'_'+str(x)+'.png' for x in index]
&&& print(files[0])
&&& baseimg=Image.open(files[0])
&&& sz=baseimg.size
&&& basemat=np.atleast_2d(baseimg)
&&& for i in range(1,num):
&&&&&&& file=files[i]
&&&&&&& im=Image.open(file)
&&&&&&& im=im.resize(sz,Image.ANTIALIAS)
&&&&&&& mat=np.atleast_2d(im)
&&&&&&& print(file)
&&&&&&& basemat=np.append(basemat,mat,axis=0)
&&& final_img=Image.fromarray(basemat)
&&& final_img.save('merged.png')
希望本文所述对大家的Python程序设计有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 python字节流处理 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信