标签: binary-data

您可以实现的随机二进制数据的最佳文件压缩是什么?

具体来说,那里有哪些程序以及压缩率最高的程序?我试过谷歌搜索它,但似乎经验会胜过搜索结果,所以我问.

compression random binary-data

37
推荐指数
2
解决办法
7万
查看次数

计算二进制数据相似度

我在这里看到了一些与确定文件相似性有关的问题,但它们都与特定域(图像,声音,文本等)相关联.作为解决方案提供的技术需要了解所比较文件的基础文件格式.我正在寻找的是一种没有此要求的方法,可以比较任意二进制文件,而无需了解它们包含的数据类型.也就是说,我希望确定两个文件的二进制数据相似百分比.

为了给你提供更多的细节,即使这可能适用于很多事情,我确实有一个特定的问题,我正在努力.我目前也有一个有效的解决方案,但我不认为它是理想的.在比较方法方面可能存在许多优化,并存储结果.希望这里的一些人能够给我一些新的想法.我可能会在几天之后编辑一些关于我当前方法的信息,但我不想通过告诉你我是如何做的来偏见人们对这个问题的想法.

我正在研究的问题是视频游戏ROM映像的克隆检测.对于那些没有仿真经验的人来说,ROM是游戏卡带上的数据转储.ROM"克隆"通常是同一游戏的修改版本,最常见的类型是翻译版本.例如,NES 的原始最终幻想的日语和英语版本是克隆.游戏几乎分享了他们所有的资产(精灵,音乐等),但文本已被翻译.

目前有几个小组致力于维护各种系统的克隆列表,但据我所知,这一切都是手动完成的.我试图做的是找到一种方法来自动和客观地检测类似的ROM图像,基于数据相似性而不是"这些似乎是相同的游戏".检测克隆有几个原因,但其中一个主要动机是与固体压缩一起使用.这允许将所有游戏克隆压缩到同一档案中,整个压缩克隆集通常只占用比单个ROM中的一个更多的空间.

提出潜在方法时需要考虑的一些问题:

  • ROM的大小各不相同,具体取决于系统.有些很小,但现代系统可能有大型,256MB或更多.一些(所有?)系统只有2个可能的大小的功能,其中一个系统上的130MB游戏将具有256MB的rom,基本上是空的.请注意,因此,如果游戏版本超过阈值并且必须使用两倍大小的盒式磁带,则某些克隆可能具有完全不同的大小.
  • 目前在许多系统上有数千种已知的ROM,大多数系统仍然不断发布新的系统.即使对于较旧的系统,也有一个主要的ROM黑客社区经常生产修改后的ROM.
  • 为每个可能的ROM对存储相似性数据将导致数百万行数据用于任何更流行的系统.具有5000个ROM的系统将需要2500万行相似性数据,其中一个新游戏添加另外5000行.
  • 处理状态必须是可恢复的,因此如果它被中断,它可以从中断的地方继续.使用任何方法,将需要大量处理,并假设整个事件将在一个批次中运行是不安全的.
  • 可以随时添加新的ROM,因此该方法不应该假设它已经具有"完整"集.也就是说,即使您已经找出所有现有ROM的相似性,如果添加了一个新的(并且这也可能在之前的处理完全完成之前发生),必须有一种方法将其与之前的所有ROM进行比较,以确定哪个(如果有的话)它是克隆的.
  • 较高的处理速度应优先于准确性(至某一点).知道两个ROM是94%还是96%相似并不是特别重要,但如果需要一天的处理时间来比较新的ROM与之前的所有ROM,那么该程序可能永远不会真正完成.

这是一个有趣的问题,我期待看到其他人能想到的东西.如果您想了解更多细节,请在评论中告诉我,我会尽力提供.

comparison similarity binary-data

34
推荐指数
4
解决办法
9360
查看次数

事后,从git存储库中修剪二进制数据

我不小心将一些大型二进制数据提交到了一些提交中.从那以后我更新了我的.gitignore,这些文件不再被提交了.但是我想回到旧的提交中,有选择地从存储库中删除这些数据,删除应该在.gitignore中的几个目录.我不想删除提交本身.

我将如何实现这一目标?我首选的方法是将.gitignore规则追溯应用于旧提交的某种方式...使用此方法的答案对其他人来说也非常有用,因为我确信我的问题不是唯一的.它也可以快速应用于通用解决方案,而无需针对每个用户的唯一目录结构进行大量自定义.

这是可能的,无论是我上面提出的简单方法,还是以更复杂的方式?

git version-control binary-data

33
推荐指数
1
解决办法
2万
查看次数

用于寻找最大平衡子阵列的节省空间的算法?

给定0和1的数组,找到最大子阵列,使得零和1的数量相等.这需要在O(n)时间和O(1)空间中完成.

我有一个算法在O(n)时间和O(n)空间中进行.它使用前缀和数组,并利用如果0和1的数量相同的事实,则sumOfSubarray = lengthOfSubarray/2

#include<iostream>
#define M 15

using namespace std;

void getSum(int arr[],int prefixsum[],int size) {
    int i;
    prefixsum[0]=arr[0]=0;
    prefixsum[1]=arr[1];
    for (i=2;i<=size;i++) {
        prefixsum[i]=prefixsum[i-1]+arr[i];
    }
}

void find(int a[],int &start,int &end) {
    while(start < end) {
        int mid = (start +end )/2;
        if((end-start+1) == 2 * (a[end] - a[start-1]))
                break;
        if((end-start+1) > 2 * (a[end] - a[start-1])) {
            if(a[start]==0 && a[end]==1)
                    start++; else
                    end--;
        } else {
            if(a[start]==1 && a[end]==0)
                    start++; else
                    end--;
        }
    }
}

int main() { …
Run Code Online (Sandbox Code Playgroud)

arrays algorithm binary-data

33
推荐指数
2
解决办法
3846
查看次数

如何获取结构数据的hexdump

 ....
 finalize(char *hdrs, sendip_data *headers[], int index,
                    sendip_data *data, sendip_data *pack)
 {

 ........
Run Code Online (Sandbox Code Playgroud)

出于调试目的,我想要一个datapack类型的十六进制转储,它们是sendip_data一种非常复杂的结构.实际上它们包含一些二进制信息,所以我不确定我的项目的输出是否正确.因此,出于调试目的,我想将数据写入文件,以便我可以使用hexdump,如下所示 -

$hexdump -C file.txt
Run Code Online (Sandbox Code Playgroud)

另外因为这是一个/ w数据包的运行时生成所以我也不确定我认为需要的长度datapack结构fread / fwrite.所以请给我一些建议.

c pointers hexdump fwrite binary-data

31
推荐指数
2
解决办法
5万
查看次数

设计休息Web服务的最佳方法,其中包含要从浏览器中使用的二进制数据

我正在开发一个json rest web服务,它将使用使用backbone.js构建的单个网页应用程序来使用

该API将允许消费者上传与某个实体相关的文件,例如与项目相关的pdf报告

谷歌搜索并在堆栈溢出做一些研究我带来了这些可能的方法:

第一种方法: base64编码数据字段

POST: /api/projects/234/reports
{
  author: 'xxxx',
  abstract: 'xxxx',
  filename: 'xxxx',
  filesize: 222,
  content: '<base64 encoded binary data>'
}
Run Code Online (Sandbox Code Playgroud)

第二种方法:多部分形式的帖子:

POST: /api/projects/234/reports
{
  author: 'xxxx',
  abstract: 'xxxx',
}
Run Code Online (Sandbox Code Playgroud)

作为回复我会得到一个报告ID,然后我会发一个帖子

POST: /api/projects/234/reports/1/content
enctype=multipart/form-data
Run Code Online (Sandbox Code Playgroud)

然后只发送二进制数据

(看看这个:https://stackoverflow.com/a/3938816/47633)

第三种方法:将二进制数据发布到单独的资源并保存href

首先,我在客户端生成一个随机密钥,并在那里发布二进制内容

POST: /api/files/E4304205-29B7-48EE-A359-74250E19EFC4
enctype=multipart/form-data
Run Code Online (Sandbox Code Playgroud)

然后

POST: /api/projects/234/reports
{
  author: 'xxxx',
  abstract: 'xxxx',
  filename: 'xxxx',
  filesize: 222,
  href: '/api/files/E4304205-29B7-48EE-A359-74250E19EFC4'
}
Run Code Online (Sandbox Code Playgroud)

(见:https://stackoverflow.com/a/4032079/47633)

我只是想知道我是否可以使用任何其他方法,每种方法的优点/缺点,以及是否有任何已建立的方法来处理这种要求

我对第一种方法的看法是,我必须在客户端上完全加载和base64编码文件

一些有用的资源:

rest binary-data backbone.js restful-architecture

31
推荐指数
3
解决办法
1万
查看次数

通过http发送二进制数据

我正在寻找有关通过端口80从远程GPRS设备发送/接收数据的最佳方法的建议.

在随机端口上创建普通TCP套接字工作正常,但许多运营商只允许端口80 HTTP流量通过其代理,然后期望HTTP ascii数据(他们可以根据需要修改标头).

那么,我的设备是否应该在持久的http连接上创建POST请求,然后从Web服务接收base64编码的响应?我不确定涉及二进制数据时移动代理的行为如何.有推荐的方法吗?

我可以调整设备的固件和服务器端应用程序.

[编辑]

我想知道是否有标准(或多或少)的方式来做到这一点.对于各种数据记录和工业系统,需要通过套接字连接发送大量二进制数据.对于以太网连接,通常只有适应某些防火墙的问题,但是持久的二进制连接在任意端口上建立都没有问题.

但是,移动ISP倾向于仅限制端口80的"数据计划".他们也可以随意使用HTTP标头,也可能是HTML数据本身.这是我需要识别潜在陷阱和规避它们的方法.

  • 简单地发送base64编码数据会起作用吗?
  • 如何处理HTTP会话?任意套接字可以保持很长时间,但HTTP动词通常是短暂的.这是否意味着我需要为每个数据包创建一个新连接?或者有没有办法通过单个连接以块的形式发送服务器响应?
  • ISP代理以什么方式处理数据或标题?例如,代理有时可以使连接保持活动状态,即使服务器关闭它也是如此.

proxy http binary-data

28
推荐指数
2
解决办法
4万
查看次数

使用apache commons-net FTPClient传输原始二进制文件?

更新:解决了

FTPClient.setFileType() 登录之前打电话,导致FTP服务器使用默认模式(ASCII),无论我将其设置为什么.另一方面,客户端的行为就像文件类型已正确设置一样.BINARY模式现在完全按照需要工作,在所有情况下逐字节传输文件.我所要做的只是在wireshark中进行一些流量嗅探,然后使用netcat模拟FTP命令以查看发生了什么.为什么我两天前没有想到这个??谢谢,大家帮忙!

我有一个xml文件,utf-16编码,我使用apache的commons-net-2.0 java库的FTPClient从FTP站点下载.它提供了支持两种传输模式:ASCII_FILE_TYPEBINARY_FILE_TYPE,不同之处在于ASCII将合适的地方行分隔符替换行分隔符('\r\n'或只是'\n'-十六进制,0x0d0a或只是0x0a).我的问题是:我有一个测试文件,utf-16编码,包含以下内容:

<?xml version='1.0' encoding='utf-16'?>
<data>
    <blah>blah</blah>
</data>

这是十六进制:
0000000: 003c 003f 0078 006d 006c 0020 0076 0065 .<.?.x.m.l. .v.e
0000010: 0072 0073 0069 006f 006e 003d 0027 0031 .r.s.i.o.n.=.'.1
0000020: 002e 0030 0027 0020 0065 006e 0063 006f ...0.'. .e.n.c.o
0000030: 0064 0069 006e 0067 003d 0027 0075 0074 .d.i.n.g.=.'.u.t
0000040: …

java ftp binary-data apache-commons-net

27
推荐指数
2
解决办法
3万
查看次数

使用带有psycopg2的二进制COPY表FROM

我有数千万行从多维数组文件传输到PostgreSQL数据库.我的工具是Python和psycopg2.批量处理数据的最有效方法是使用copy_from.但是,我的数据大多是32位浮点数(real或float4),所以我宁愿不转换为real→text→real.这是一个示例数据库DDL:

CREATE TABLE num_data
(
  id serial PRIMARY KEY NOT NULL,
  node integer NOT NULL,
  ts smallint NOT NULL,
  val1 real,
  val2 double precision
);
Run Code Online (Sandbox Code Playgroud)

这是我使用字符串(文本)使用Python的地方:

# Just one row of data
num_row = [23253, 342, -15.336734, 2494627.949375]

import psycopg2
# Python3:
from io import StringIO
# Python2, use: from cStringIO import StringIO

conn = psycopg2.connect("dbname=mydb user=postgres")
curs = conn.cursor()

# Convert floating point numbers to text, write to COPY input
cpy = StringIO()
cpy.write('\t'.join([repr(x) for x in …
Run Code Online (Sandbox Code Playgroud)

python postgresql bulkinsert psycopg2 binary-data

27
推荐指数
1
解决办法
2万
查看次数

将二进制字符串转换为numpy数组

假设我有字符串:

my_data = '\x00\x00\x80?\x00\x00\x00@\x00\x00@@\x00\x00\x80@'
Run Code Online (Sandbox Code Playgroud)

我得到它是无关紧要的,但为了具体的东西,假设我从二进制文件中读取它.

我知道我的字符串是4(4字节)浮点数的二进制表示.我想把这些花车作为一个numpy阵列.我做到:

import struct
import numpy as np
tple = struct.unpack( '4f', my_data )
my_array = np.array( tple, dtype=np.float32 )
Run Code Online (Sandbox Code Playgroud)

但是创建一个中间元组似乎很愚蠢.有没有办法在不创建中间元组的情况下执行此操作?

编辑

我还希望能够以这样的方式构造数组,以便我可以指定字符串的字节顺序.

python numpy binary-data

26
推荐指数
1
解决办法
3万
查看次数