我正在接收字符串中的二进制数据。我想将其编码为 Base64。是否有任何类可以执行该操作(我想要一个 API)。
我想知道是否有可能一个实用程序生成二进制数据(即图形图像)并通过 IO 控制台输出它们,而另一个应用程序在了解这些数据的性质并获悉传入字节数的情况下能够从 IO 控制台读取它。
是否可以将二进制数据插入MySQLTEXT列?我有一个表,我想用它来存储 UTF-8 文本和二进制数据(非常基本的结构 - id int(11), type char(1), data text),但是当我尝试将一些二进制数据(JPEG 图像)插入到列中时data,该列是空的。
我在 PHP 中使用mysql_query和mysql_real_escape_string来执行 INSERT 查询,它们都应该是二进制安全的。示例代码:
mysql_query("INSERT INTO my_table VALUES(" . (int)$id . ", 'b', '" . mysql_real_escape_string($jpegImageData) . "')");
Run Code Online (Sandbox Code Playgroud)
我不想将data列类型更改为BLOB- 在某些情况下,我需要使用来比较/整理此列中的字符串。
我目前正在为一项学校作业做一些研究。我有两个数据流,一个是用户评分,另一个是网店的搜索、点击和订单历史(二进制数据)。
我发现如果您使用评级数据,协同过滤是最好的算法系列。我发现并研究了这些算法:
基于内存
基于用户
基于项目
相似融合
基于模型
现在我正在寻找一种使用二进制数据的方法,但我很难弄清楚是否可以使用二进制数据而不是这些算法的评级数据,或者是否有不同的算法系列我应该看着 ?
我提前为拼写错误道歉,因为我有阅读障碍并且不是本地作家。感谢 marc_s 的帮助。
这似乎是应该有很多重复和大量答案的问题类型,但我的搜索只导致沮丧,没有可用的解决方案。
在 Python(最好是 3.x)中,我想知道如何打开任意类型的文件,读取存储在磁盘上的字节,并以最“原生”、“原始”、“ raw' 形式,在对它们进行任何编码之前。
如果文件作为流存储在磁盘上,00010100 10000100 ...那么这就是我希望在屏幕上显示的内容。
这类问题通常会引起“您为什么想知道”和“用例是什么”的回答。我很好奇,这是我的用例。
在将其标记为重复之前,请确保您想到的答案确实回答了问题(而不仅仅是讨论编码等)。谢谢!
前三个答案后编辑:
感谢到目前为止的三位响应者,特别感谢 JF Sebastian 进行的扩展讨论。从所说的内容看来,我的问题归结为文件中的字节如何物理记录到磁盘以及如何读取和呈现它们。在这一点上,在 Python 中似乎不可能以原始形式获得字节的视图,但它们有各种表示形式;整数、十六进制值、ascii 等。由于问题尚未解决,我将保留问题以供更多输入。
我正在使用 api 来获取他们存储的图像,并将其用作我们应用程序用户的个人资料图片。我使用 Ruby on Rails 和 ActiveStorage 与 AWS 来附加和存储图像。他们发回的内容是这样的:
{"status"=>"shared", "values"=>[{"$objectType"=>"BinaryData", "data"=>"/9j/4AAQSkZJRgABAQAASABIAAD/4QBMRXhpZgAAT.....KK5tT/9k=", "mime_type"=>"image/jpeg", "metadata"=>{"cropped"=>false}}]}
Run Code Online (Sandbox Code Playgroud)
我尝试了很多不同的方法来附加它并操作数据,例如直接附加它,Base64.decode64,Base64.encode64。我还尝试创建一个新文件然后附加它。这里有些例子:
data = Base64.decode64(Base64.encode64(response[:selfie_image]["values"][0]["data"]))
user.profile_pic.attach!(
io: StringIO.new(open(data).read),
filename: "#{user.first_name}_#{user.last_name}_#{user.id}.jpg",
content_type: "image/jpeg"
)
Run Code Online (Sandbox Code Playgroud)
data = Base64.decode64(Base64.encode64(response[:selfie_image]["values"][0]["data"]))
out_file = File.new("#{user.first_name}_#{user.last_name}_# . {user.id}.jpg", "w")
out_file.puts(data)
out_file.close
user.profile_pic.attach(
io: StringIO.new(open(out_file).read),
filename: "#{user.first_name}_#{user.last_name}_#{user.id}.jpg",
content_type: "image/jpeg"
)
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
user.profile_pic.attach(out_file)
Run Code Online (Sandbox Code Playgroud)
它要么一直说附件为零,要么根据我操作数据的方式,它会说不是 jpeg 文件内容头类型错误并将其作为图像魔法错误抛出。
我如何操作这些数据,以便能够使用 ActiveStorage 将其作为图像附加给我们的用户?
jpeg ruby-on-rails imagemagick binary-data rails-activestorage
我正在尝试从二进制字符串下载 PDF 文件,这是我从 Ajax 收到的响应。
我收到以下数据(binaryString):
%PDF-1.4....
.....
....content of file
....
%% EOF
Run Code Online (Sandbox Code Playgroud)
我试过这个:
var blob=new Blob([binaryString], {type: "application/pdf"});// change resultByte to bytes
var link=document.createElement('a');
link.href=window.URL.createObjectURL(blob);
link.download="myFileName.pdf";
link.click();
Run Code Online (Sandbox Code Playgroud)
还尝试使用download.js库:
download(binaryString, "file.pdf", "application/pdf");
Run Code Online (Sandbox Code Playgroud)
我有简单的c程序,比如my_bin.c:
#include <stdio.h>
int main()
{
printf("Success!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我用gcc编译它并得到了可执行文件:my_bin.
现在我想使用另一个C程序调用main(或运行此my_bin).我用mmap和函数指针做了这样的事情:
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
int main()
{
void (*fun)();
int fd;
int *map;
fd = open("./my_bin", O_RDONLY);
map = mmap(0, 8378, PROT_READ, MAP_SHARED, fd, 0);
fun = map;
fun();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑1:添加PROT_EXEC从响应中更清楚......我想在第二个程序中调用外部二进制程序.
我不知道如何使用main(其他程序)的地址初始化函数指针.任何的想法?
为什么seg故障,谷歌搜索后,想通了,因为我的大小和mmap的偏移量参数.它应该是pagesize的倍数.[参考:Segfault在C中使用mmap读取二进制文件
现在代码看起来像:
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
int main()
{
void (*fun)();
int fd;
int *map;
int offset = 8378;
int pageoffset = offset % getpagesize();
fd = open("./my_bin", O_RDONLY); …Run Code Online (Sandbox Code Playgroud) 我的设置是基于Flask的服务器。该项目的鸟瞰图是:基于Flask的服务器基于一些算法计算(例如找出要从S3提取的文件名)从AWS S3提取二进制数据,并将数据提供给HTML + JavaScript客户端。
起初,我认为JSON对象是最好的响应类型。我创建了以下格式的JSON响应(可能在语法上不正确):
{
'payload': [
{
'symbol': 'sym',
'exchange': 'exch',
'headerfile': {
'name': '#name',
'content': '#binarycontent'
},
'datafiles': [
{
'name': '#name',
'content': '#binarycontent'
},
{
'name': '#name',
'content': '#binarycontent'
}
]
},
'errors': [ //errors ]
}
Run Code Online (Sandbox Code Playgroud)
对于JSON中的任何语法错误,我深表歉意。我有点想找出一个小错误。在构造了此JSON之后,我知道JSON本身并不支持二进制数据。因此,我将无法将二进制数据作为值嵌入JSON中。
我意识到,我始终可以将字节转换为base64编码的字符串,并将该字符串用作JSON中的值。但是,结果字符串的大小要多出30%左右。4010字节的数据被编码为5348字节,虽然对于单个二进制块来说微不足道,但是当我将大量此类二进制块嵌入JSON响应时,我的客户将其视为一个问题。由于尺寸较大,响应需要更多时间才能到达客户,这是我客户的应用程序的关键问题。
我考虑的另一种选择是将二进制块流式传输octet-stream Content-Type到客户端。但是我不确定它是否比上述解决方案更好。此外,在这种情况下,我还无法弄清楚如何关联二进制块及其名称。
有没有比“将二进制文件转换为文本并嵌入JSON”更好的解决方案?
我正在写一个STL文件,它由一个80字节的头,一个4字节的整数组成,然后是50个字节的记录,每个字节由浮点数和一个短整数组成.
使用RandomAccessFile我可以轻松地写入数据,但速度非常慢.它使用与DataOutputStream相同的接口.如果有一种简单的方法来缓冲数据输出流,我可以使用它,但烦人的部分是需要写出所有记录,并在最后计算三角形输出的数量,并将该整数写入字节81- 84.
直截了当但缓慢的方式,只关注大部分工作,即写下每个方面:
public static void writeBinarySTL(Triangle t, RandomAccessFile d) throws IOException {
d.writeFloat((float)t.normal.x);
d.writeFloat((float)t.normal.y);
d.writeFloat((float)t.normal.z);
d.writeFloat((float)t.p1.x);
d.writeFloat((float)t.p1.y);
d.writeFloat((float)t.p1.z);
d.writeFloat((float)t.p2.x);
d.writeFloat((float)t.p2.y);
d.writeFloat((float)t.p2.z);
d.writeFloat((float)t.p3.x);
d.writeFloat((float)t.p3.y);
d.writeFloat((float)t.p3.z);
d.writeShort(0);
}
Run Code Online (Sandbox Code Playgroud)
是否有任何优雅的方法将这种二进制数据写入块状快速I/O类?
在我看来,STL文件格式应该首先是低字节,Java可能是高字节优先.所以也许我的所有writeFloats都是徒劳的,我必须找到一个手动转换,以便它以小端形式出现?
如果必须,我愿意关闭文件,最后在randomaccessfile中重新打开,寻找字节81并写入计数.
因此,此编辑是对应该起作用的问题的两个答案的回应.第一个是添加BufferedWriter.结果非常快.我知道这台笔记本电脑是高端的SSD,但我并不期待这种性能,更不用说来自Java了.只需缓冲输出,在0.5秒内写入96Mb文件,在1.5秒内写入196Mb.
为了了解nio是否会提供更高的性能,我试图通过@ sturcotte06实现解决方案.代码不会尝试写标题,我只关注每个三角形的50字节记录.
public static void writeBinarySTL2(Shape3d s, String filename) {
java.nio.file.Path filePath = Paths.get(filename);
// Open a channel in write mode on your file.
try (WritableByteChannel channel = Files.newByteChannel(filePath, StandardOpenOption.CREATE)) {
// Allocate a new buffer.
ByteBuffer buf = ByteBuffer.allocate(50 * 1024);
ArrayList<Triangle> triangles = s.triangles;
// Write …Run Code Online (Sandbox Code Playgroud)