我需要能够以自定义二进制文件格式存储一些数据.我以前从未设计过自己的文件格式.它需要是一个友好的格式,用于在C#,Java和Ruby/Perl/Python世界之间旅行.
从文件开始将包含记录.GUID字段和JSON/YAML/XML数据包字段.我不确定用什么作为分隔符.逗号,制表符或换行符似乎太脆弱了.Excel做什么?还是XML前的OpenOffice格式?你应该使用ASCII字符0或1.不知道从哪里开始.有关该主题的任何文章或书籍?
该文件格式可以稍后扩展以包括"标题部分".
注意:首先,我将使用.NET,但我希望该格式易于移植.
更新:
"数据包"的处理可能很慢,但文件格式内的导航不能.所以我认为XML不在议事日程中.
如果DataSet包含时间戳或其他二进制值的列,则在显示该列中的任何数据时,其关联的DataGridView将抛出ArgumentException.也就是说,假设您有一些包含二进制列的表,例如:
CREATE TABLE [dbo].[DataTest](
[IdStuff] INT IDENTITY(1,1) NOT NULL,
[ProblemColumn] TIMESTAMP NOT NULL )
Run Code Online (Sandbox Code Playgroud)
在Visual Studio 2008中,添加指向可疑表的新数据源.将表从数据源资源管理器拖到新WinForm的可视化设计器表面上,以自动创建DataGridView,BindingSource等.执行应用程序,您将获得运行时异常.听起来像是一个缺陷,对吧?
如果检查DataGridView的Columns集合,您会发现它将列类型设置为DataGridViewImageColumn.为什么?因为,根据微软的说法,.NET假定二进制列是图像.事实上,微软肯定这种行为是设计的!请参阅Microsoft Connect上的此缺陷报告:http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx ?FeedbackID = 93639
可以通过处理DataGridView的DataError事件来抑制错误对话框,正如对话框礼貌地指出的那样,但这引出了问题.我想找到一种方法来避免首先出现错误.也就是说,我希望有一个DataGridViewTextColumn显示二进制数据的文本表示,例如"0x1234a8e9433bb2".我正在寻找一个通用的解决方案,因为我的实际代码不使用上面示例中的特定表.相反,我在dataAdapter.SelectCommand中添加了一些任意的查询,然后调用
dataAdapter.Fill(dataTable)
Run Code Online (Sandbox Code Playgroud)
自动生成我的dataTable.由于DataGridView有(恕我直言)错误,我想我需要检查数据表的列(即dataTable.Columns [n] .DataType.Name.Equals("Byte []")?)并在将dataTable连接到DataGridView之前手动将任何字节数组转换为其文本形式
bindingSource.DataSource = dataTable;
Run Code Online (Sandbox Code Playgroud)
那我的问题是:
是否有更简单或更优雅的方式在DataGridView中显示二进制列?
(请注意,VS 2005和VS 2008,.NET 2.0和.NET 3.5都存在此问题.)
我有这个文本文件包含不同的字段.某些字段可能包含二进制数据.我需要获取文件中的所有数据,但是现在使用StreamReader时它不会读取二进制数据块和数据之后的内容.什么是解决这个问题的最佳解决方案?
例:
field1|field2|some binary data here|field3
Run Code Online (Sandbox Code Playgroud)
现在我在文件中读到这样的:
public static string _fileToBuffer(string Filename)
{
if (!File.Exists(Filename)) throw new ArgumentNullException(Filename, "Template file does not exist");
StreamReader reader = new StreamReader(Filename, Encoding.Default, true);
string fileBuffer = reader.ReadToEnd();
reader.Close();
return fileBuffer;
}
Run Code Online (Sandbox Code Playgroud)
编辑:我知道二进制字段的开始和结束位置.
在我的程序中,用户可以加载带有链接的文件(它是一个webcrawler),但是我需要验证用户选择的文件是纯文本还是其他东西(只允许纯文本).
有可能这样做吗?如果有用,我正在使用JFileChooser打开文件.
编辑:
用户期望的是:包含URL的文本文件.
我想避免的:用户从MS Word加载MP3文件或文档(示例).
我一直试图阅读iostream并更好地理解它们.偶尔我发现它强调inserters(<<)和extractors(>>)意味着在文本序列化中使用.这是一些地方,但这篇文章是一个很好的例子:
http://spec.winprog.org/streams/
在<iostream>宇宙之外,有些情况下<<和>>以类似流的方式使用但不遵守任何文本约定.例如,他们在Qt使用时编写二进制编码数据QDataStream:
http://doc.qt.nokia.com/latest/qdatastream.html#details
在语言层面,<<和>>运算符属于你的项目要重载(因此QDataStream的作用显然是可以接受的).我的问题是那些使用<iostream><<和>>运算符来实现二进制编码和解码的人是否被认为是一种不好的做法.是否(例如)有任何期望,如果写入磁盘上的文件,该文件应该可以使用文本编辑器查看和编辑?
如果一个总是使用其他方法名称和基地他们read()和write()?或者文本编码应该仅仅被视为默认行为,与标准库iostream集成的类可以选择忽略?
更新关于此的一个关键术语问题似乎是"格式化"与"未格式化"的I/O的区别(与术语"文本"与"二进制"相对).我发现了这个问题:
将二进制数据(std :: string)写入std :: ofstream?
来自@ TomalakGeret'kal的评论说:"我不想使用<<用于二进制数据,因为我的大脑将其视为"格式化输出",这不是你正在做的事情.再次,它完全有效,但我不会那样混淆我的大脑."
这个问题的公认答案说只要你使用就可以了ios::binary.这似乎支持了辩论的"它没有任何问题"...但我仍然没有看到任何权威来源的问题.
所以,我用fortran创建了一个二进制文件,使用类似的东西:
open (3,file=filename,form="unformatted",access="sequential")
write(3) matrix(i,:)
Run Code Online (Sandbox Code Playgroud)
我理解它的方式,fortran在文件的两端填充4个字节的文件,其余的只是我想要的数据(在这种情况下,1000个双打的列表).
我想用gnuplot读取这个,但是,我不知道如何让gnuplot跳过第一个和最后4个字节,并将其余部分读作双打.在这方面,文档不是很有用.
谢谢
我有一个以二进制数据保存的原始图像文件(无编码).我想读取文件并将值转换为unsigned char.但我不知道如何开始这样做.每个文件包含640x480字节.每个像素是8位.
我在这里使用了C++帮助页面:http://www.cplusplus.com/doc/tutorial/files/,但是当我在宣传数据时,它似乎显示了相同的二进制/非人类可读字符.有人可以建议吗?到目前为止,这是我的代码:
#include <iostream>
#include <fstream>
using namespace std;
ifstream::pos_type size;
char * memblock;
int main () {
ifstream file ("imageData.raw", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = file.tellg();
memblock = new char [size];
file.seekg (0, ios::beg);
file.read (memblock, size);
cout << "the complete file content is in memory";
for (int l=0; l<size; l++){
cout << " memblock[] is = " << (unsigned char)memblock[l] << " index was l = " << l << endl;
}
file.close();
delete[] …Run Code Online (Sandbox Code Playgroud) 我必须通过php中的cURL发送data-binary参数.
这是命令:curl -D - -u user:password -X PUT -H "Content-Type: text/plain" --data-binary "data-id=2010-10-01_15-15-53" https://someurl.在控制台这工作,现在我必须在PHP中.
这是我的代码:
$this->_curl = curl_init();
curl_setopt($this->_curl, CURLOPT_USERPWD, $this->_loginUser . ":" . $this->_loginPassword);
curl_setopt($this->_curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($this->_curl, CURLOPT_HEADER, 1);
curl_setopt($this->_curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($this->_curl, CURLOPT_TIMEOUT, 30);
curl_setopt($this->_curl, CURLOPT_URL, $this->_serviceUrl);//https://someurl
curl_setopt($this->_curl, CURLOPT_HTTPHEADER, array('Content-Type: text/plain'));
curl_setopt($this->_curl, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($this->_curl, CURLOPT_POSTFIELDS, array('data-id' => $dataId));//d'2010-10-01_15-15-53'
$response = curl_exec($this->_curl);
//$response = HTTP/1.1 201 Created
curl_close($this->_curl);
Run Code Online (Sandbox Code Playgroud)
该调用被服务器接受,但它无法识别data-id参数:
触发器2010-10-01_15-15-53中未定义data-id属性
知道我错过了什么吗?
我有一个简单的二进制文件,包含彼此相邻的32位浮点数.
使用Julia,我想读取每个数字(即每个32位字)并将它们按顺序放入Float32格式数组中.
我通过查看文档尝试了一些不同的东西,但都产生了不可能的值(我使用的是具有已知值的二进制文件作为虚拟输入).看起来:
Julia一次只读取一个字节的二进制文件.
Julia将每个字节放入一个Uint8数组中.
例如,readbytes(f, 4)给出一个4元素的无符号8位整数数组.read(f, Float32, DIM)也给出了奇怪的价值.
任何人都知道我该怎么办?
我有一个整数数组
Array
(
[0] => Array
(
[0] => 1531412763
[1] => 1439959339
[2] => 76
[3] => 122
[4] => 200
[5] => 4550
[6] => 444
)
...
Run Code Online (Sandbox Code Playgroud)
依此类推,我想如果我把它看作是一个数据库 - 最外层数组的元素是行,内部数组的元素是列.
我想将该信息保存到文件中,以便稍后我可以检索它,但我想将其保存为二进制数据以节省空间.基本上,如果我将示例中的第一个整数写入1531412763文件,它将占用10个字节,但如果我可以将其保存为有符号整数,则需要占用4个字节.
我已经看了一些其他的答案,这些答案都建议使用fwrite哪些我无法理解如何以这种方式使用?
binary-data ×10
binaryfiles ×3
.net ×2
c++ ×2
php ×2
text ×2
binary ×1
c# ×1
curl ×1
datagridview ×1
file ×1
file-format ×1
file-io ×1
filesystems ×1
fortran ×1
gnuplot ×1
iostream ×1
java ×1
julia ×1
sql-server ×1
streamreader ×1