小编dme*_*ter的帖子

JSON字符串中的二进制数据.比Base64更好的东西

JSON格式本身不支持二进制数据.必须对二进制数据进行转义,以便可以将其放入JSON中的字符串元素(即使用反斜杠转义的双引号中的零个或多个Unicode字符).

转义二进制数据的一个明显方法是使用Base64.但是,Base64具有很高的处理开销.它还将3个字节扩展为4个字符,从而使数据量增加了大约33%.

一个用例是CDMI云存储API规范的v0.8草案.您可以使用JSON通过REST-Webservice创建数据对象,例如

PUT /MyContainer/BinaryObject HTTP/1.1
Host: cloud.example.com
Accept: application/vnd.org.snia.cdmi.dataobject+json
Content-Type: application/vnd.org.snia.cdmi.dataobject+json
X-CDMI-Specification-Version: 1.0
{
    "mimetype" : "application/octet-stream",
    "metadata" : [ ],
    "value" :   "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
    IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
    dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
    dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
    ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=",
}
Run Code Online (Sandbox Code Playgroud)

是否有更好的方法和标准方法将二进制数据编码为JSON字符串?

base64 json

581
推荐指数
10
解决办法
45万
查看次数

为什么SCTP没有太多使用/已知

我最近查看了Richards Stevens 撰写的"UNIX网络编程,第1卷"这本书,我发现除了TCP和UDP之外还有第三个传输层标准:SCTP.

简介:SCTP是一种传输级协议,它像UDP一样是消息驱动的,但是像TCP一样可靠.以下是IBM DeveloperWorks简短介绍.

老实说,我以前从未听说过SCTP.我记不起在任何网络书籍中阅读它或在我参加的课程中听到它.阅读提到SCTP的其他stackoverflow问题表明,我并不孤单,因为缺乏这方面的知识.

为什么SCTP如此未知?为什么没用多少?

networking tcp popularity sctp

185
推荐指数
8
解决办法
5万
查看次数

检查Python中的对象是否像文件一样

类文件对象是Python中的对象,其行为类似于真实文件,例如具有read()和write方法(),但具有不同的实现.它是鸭子打字概念的实现.

在文件预期的任何地方允许类似文件的对象被认为是一种好的做法,例如可以使用StringIO或Socket对象来代替真实文件.所以执行这样的检查是不好的:

if not isinstance(fp, file):
   raise something
Run Code Online (Sandbox Code Playgroud)

检查对象(例如方法的参数)是否"类似文件"的最佳方法是什么?

python file

86
推荐指数
6
解决办法
4万
查看次数

真的在Java中强制文件同步/刷新

如何通过Java 真正使用块设备刷新/同步写入文件的数据.

我用NIO试过这段代码:

FileOutputStream s = new FileOutputStream(filename)
Channel c = s.getChannel()
while(xyz)
    c.write(buffer)
c.force(true)
s.getFD().sync()
c.close()
Run Code Online (Sandbox Code Playgroud)

我认为c.force(true)与s.getFD()同步.sync()应该足够了,因为强制状态的文档

强制将此通道文件的任何更新写入包含它的存储设备.如果此通道的文件驻留在本地存储设备上,则当此方法返回时,保证自创建此通道以来对文件所做的所有更改,或者自上次调用此方法以来,该文件都将写入该设备.这对于确保在系统崩溃时不会丢失关键信息非常有用.

同步状态的文档:

强制所有系统缓冲区与底层设备同步.在将此FileDescriptor的所有已修改数据和属性写入相关设备之后,此方法返回.特别是,如果此FileDescriptor引用物理存储介质(例如文件系统中的文件),则在将与此FileDesecriptor关联的缓冲区的所有内存中修改副本写入物理介质之前,不会返回sync.sync意味着需要物理存储(例如文件)处于已知状态的代码.

这两个电话应该足够了.是吗?我猜他们不是.

背景:我使用C/Java进行小的性能比较(2 GB,顺序写入),Java版本的速度是C版本的两倍,可能比硬件速度快(单个HD上的速度为120 MB/s).我还尝试使用Runtime.getRuntime().exec("sync")执行命令行工具同步,但这并没有改变行为.

导致70 MB/s的C代码(使用低级API(打开,写入,关闭)不会发生太大变化):

FILE* fp = fopen(filename, "w");
while(xyz) {
    fwrite(buffer, 1, BLOCK_SIZE, fp);
}
fflush(fp);
fclose(fp);
sync();
Run Code Online (Sandbox Code Playgroud)

没有最后的同步调用; 我得到了不切实际的价值(超过1 GB又称主内存性能).

为什么C和Java之间有这么大的差异?有两种可能性:我没有在Java中正确地同步数据,或者C代码由于某种原因是次优的.

更新:我已经使用"strace -cfT cmd"完成了strace运行.结果如下:

C(低级API):MB/s 67.389782

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 87.21    0.200012      200012         1           fdatasync
 11.05    0.025345           1     32772           write
  1.74    0.004000 …

java storage

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

UNIX便携式原子操作

在C中是否有(POSIX-)可移植方式用于原子变量操作,类似于使用pthread的可移植线程?

原子操作是像"递增和获取"这样的操作,它们以原子方式执行,这意味着没有上下文切换可以干扰操作.在Linux内核空间中,我们必须使用atomic_t类型,在Java中我们有java.util.concurrent.atomic包.

在Linux上,atomic.h文件提供原子操作,但include依赖于平台,例如#include <asm-x86_64/atomic.h>,它在Mac OS X上不能以类似的方式提供.

c concurrency posix atomic

30
推荐指数
4
解决办法
3万
查看次数

相当于Python中的LinkedHashMap

LinkedHashMap是具有可预测迭代顺序的类似Hashtable的数据结构(Python中的dict)的Java实现.这意味着在遍历所有键的过程中,它们是通过插入来排序的.这是通过维护插入顺序的附加链表来完成的.

是否有与Python相同的东西?

python

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

为什么将函数参数标记为volatile

我目前正在阅读PostgreSql代码.以下是缓冲区管理器的摘录:

static void WaitIO(volatile BufferDesc *buf);
static bool StartBufferIO(volatile BufferDesc *buf, bool forInput);
static void TerminateBufferIO(volatile BufferDesc *buf, bool clear_dirty,
Run Code Online (Sandbox Code Playgroud)

我知道volatile关键字通常用于设备驱动程序和嵌入式系统.关键字有解释.

当在类型定义中使用关键字volatile时,它会向编译器指示它应如何处理变量.它主要告诉编译器,由于程序外部的操作或当前执行行,变量的值可能随时发生变化.(来源)

那么为什么某些函数参数被声明为volatile?我不希望DMA改变指针位置.那么这里发生了什么?

c parameters volatile

19
推荐指数
2
解决办法
9017
查看次数

__udivdi3 undefined - 如何找到使用它的代码?

在32位Linux内核上编译内核模块会导致

"__udivdi3" [mymodule.ko] undefined!
"__umoddi3" [mymodule.ko] undefined!
Run Code Online (Sandbox Code Playgroud)

在64位系统上一切都很好.据我所知,原因是32位Linux内核不支持64位整数除法和模数.

如何找到发出64位操作的代码.它们很难手动找到,因为我无法轻易检查"/"是32位宽还是64位宽.如果"正常"函数未定义,我可以grep它们,但这不可能在这里.还有另一种搜索引用的好方法吗?某种"机器代码grep"?

该模块由几千行代码组成.我真的不能手动检查每一行.

c linux kernel linux-kernel

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

而(1)..打破而不是转到

我在C程序中找到了以下代码:

while (1)
{
    do_something();
    if (was_an_error()) break;

     do_something_else();
     if (was_an_error()) break;

     [...]

     break;
}
[cleanup code]
Run Code Online (Sandbox Code Playgroud)

这里while(1)用作"终于"的本地模拟.你也可以用gotos 写这个:

do_something()
if (was_an_error()) goto out;

do_something_else()
if (was_an_error()) goto out;

[...]
out:
[cleanup code]
Run Code Online (Sandbox Code Playgroud)

我认为goto解决方案是一种常用的习惯用法.我在内核源代码中看到过几次这种习惯用法,在Diomidis Spinellis的"代码阅读"一书中也提到过.

我的问题是:什么解决方案更好?有没有具体的理由使用该while(1)解决方案?

问题943826没有回答我的问题.

c goto

17
推荐指数
7
解决办法
1万
查看次数

生成Zipf分发的随机数

齐普夫概率分布经常被用来在P2P系统的项目文件大小分布或项目的访问分布模型.例如"Web缓存和Zip像分布证据和影响",但BoostGSL(Gnu科学库)都没有提供使用此分布生成随机数的实现.我还没有找到使用常见搜索引擎的(值得信赖的)实现.

如何使用U(0,1)随机生成器(例如Mersenne twister?)根据Zipf分布分布的随机数?

random math probability

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