.NET平台下本着C3D文件之读写

至于默认皮肤字体

民用认为再次安也编码为Georgia 18px,候选为微软非常黑 20px
之时节,用TSF传统样式,横版的早晚,效果还可。

肌肤嘛,分享下,大家如果喜欢就用吧。 google在线五笔
皮肤

除一次性将C3D文件内容全读取出来的这种办法外,还得动用C3DReader来一帧一帧之读取。

go五笔 v0.0.2

  • 加入新世纪版本
  • 86本子收录几独无经常因此汉字,其它无更新

参数组描述长度

五笔码表整理自Google在线五画,拼音反查自Android拼音码表

理码表是一个不易的历程,中间经历了成百上千时空,很多转业。14年的某个同龙,无意间觉得Google在线五画精炼高效,打得矣多数繁体字,日常行使足够;没有那基本上之重码,常用词语也用得非常好;最受人觉得甚爽朗的是冲王码正统的科班86五笔(WB-18030标准五笔),关于专业86五笔画,个人大约记得是为着优化录入GB18030字符集时的部分重码问题跟编码不正规的题目而举行的一个修正版(因为王码官网改版,无从考证了,反正知道之口即使是清楚,欢迎指正),也下了王码公司提供的五笔里面的容错码;

所以,,你懂的。

Rime,一个着实的神级输入法,能充分智能的想法了解你的输入意图,所以管收拾的码表放入小狼毫(Rime的Windows版本)里面用,到现在毕,一真看格外当然,她会明白乃于tdkuthp是在打知道,并且由完了还忙不迭你记着,下次这般打吗尽管出了,当然也招致了身打五笔画时会见于轻易,经常不是四码的由部分用语。
有关小狼毫客户端的部分兼容问题,有时也会见被人口认为十分痛。不过最近大神在为此Google Input Tools做新的输入客户端,试用了佛振大大
2015年10月10哀号发布之散装版,稳定性以及兼容性那是尚未得说,不过挂了和睦之五笔码表之后不能自动造词,不可知反查了,也没找到具体的解决办法;相信后续的本应该非常值得期待的。

用先后摸索了好多的五笔画,第一不良探望支持“标准五笔”的凡无限五笔,很简短的痛感,但是,自己试试的那版没有错码(比如象字只能qke,不能qje)。

故此过许多那个成了之五笔,很多都记不得名字,基本要先的老码表,极爽词库(的的确确是个好词库)之类。

再后来,用了但是可五笔,实实在在异常心动,开放码表,标准五笔,支持容错,甚至支持容错的用语,心里决定,就一直就此此了,槽点是sss的飞速命令,我思说之是,放在sss这边确确实实好也?当下就算让替换成了zss,心里也就是踏实了,想在以后如用在导出的码表,用底下向内一个调换就哼了,直到有一个一眨眼,打及了字,用aai尚无打出去,再就此王码五笔2012a那个版本尝试了下,aai字,也是字之容错码,不知是哪里原因,自从这之后,也就是从头当不好词库有硌特别,之类的……

恍如发出部分地方有点强迫症的自家,在不知不觉中,就开辟的DDImgen,就推广上了和睦收拾的码表,就报错了,就闪退了,就百度了,就映入眼帘多多生成器的文档了,就改成了码表格式,改码表为GB18030编码了,就那深成了一个输入法,就那么安装了,就那会为此了,就那么用正在的发和刚刚放开上Rime时候的感觉到是同的,与当网页端下google五笔的感觉是一样的,不由自主地,就那找来了多皮编辑器,顺带着下载了几乎单皮肤,就那么开各种法子地抠图,调整,试着开打了跟网页端差不多一个法的皮,虽然到最后,还是不净相同,只是像那一点点,也认了咔嚓,毕竟,自己看好才是真正吓,就算没有一个总人口就此这个华丽的go五笔,至少,还有本人自己愿。

数据区域开始于参数集合中之”POINT”参数组吃的”DATA_START”参数,其表示数据区域开始的Section
ID,除此之外,在文书头着吗发生一致客副本。不过按照法定的传教,如果文件头与参数集合中都有的内容,优先读取参数集合中之多少。

下载

86版64位密码: qe7k

86版32位密码: y25a

06版64位密码: d2ug

06版32位密码: bxxz

百度云下载


内前2独字节官方说一直忽略就实行,但是以配合于写入的时节还是如写上的。第3许节其实我们循梯次读到头也不需以此数量。这其间要的凡CPU类型,由于不同CPU类型采用的字节序以及存储的浮点数字有所不同,所以我们还索要依据CPU类型进行对应的处理。

go五笔 v0.0.1

  • 根据Google在线五笔整理制作
  • 规范86五画(标准五笔字型WB-18030)
  • 完的容错码支持
  • 拼音反查支持(码表自Android开源拼音,Rime使用同样方式)
  • 机动造词

外一个是C3D文件能够在不同档次的CPU上生成,这表现为不同CPU可能使用的许节序(Endian)和浮点数字不同,比如大家之所以的CPU都是使Little-Endian以及IEEE754的浮点数标准。从网上查还发现来DEC
(VAX)以及IBM等CPU采用不同的浮点数标准,详见我事先同一首文章:http://www.cnblogs.com/mayswind/p/3365594.html。而C3D则是支撑3好像CPU,Intel
CPU采用Little-Endian以及IEEE754标准的浮点数,DEC
(VAX)采用的Little-Endian以及故意的浮点数,MIPS
(SGI)采用的Big-Endian以及IEEE754标准的浮点数,所以于读取文档的上恐怕得分外开展拍卖,在第三节约会详细说明。

下载

百度云下载

64位 密码: cets
MD5:8f6f7fee90ef42bdce1db35ec6ab8c35

32位 密码: u9eu
MD5:956af2bf4efa094fce322ba9ca115ea2

链接失效烦请评论报!

【三、C3D文件参数集合的构造】 

码表里面的才字个数

一起20979只单词,个人整理,与GB18030双字节区的21003字
有出入,具体什么独状态,不理解。

参数实际内容

GB2312 一级常用字(3755字)固顶

关押了今日之王码五笔,138第一,才能够确实自由之打五笔画,真的是好小气好小气哦,也难怪,这东西自然就是是住户的生命线,不是也?
既然如此免费用户可以起出来GB2313里面的一级常用汉字,那么自己不怕管就一级常用汉字固顶吧。

倘对参数集合,开头的4字节定义如下:

至于创新

纪念被这篇博文做呢go五画的唯一发布平台,转载请注明出处:http://www.cnblogs.com/nimeiz/p/5290785.html

 1 using (FileStream fs = new FileStream("文件路径", FileMode.Open, FileAccess.Read))
 2 {
 3     C3DReader reader = new C3DReader(fs);
 4     C3DHeader header = reader.ReadHeader();
 5     C3DParameterDictionary dictionary = reader.ReadParameters();
 6     Int32 index = header.FirstFrameIndex;
 7 
 8     while (true)
 9     {
10         C3DFrame frame = reader.ReadNextFrame(dictionary);
11 
12         if (frame == null)
13         {
14             break;
15         }
16 
17         for (Int16 j = 0; j < frame.Point3Ds.Length; j++)
18         {
19             Console.WriteLine("Frame {0} : X = {1}, Y = {2}, Z = {3}",
20                 index++,
21                 frame.Point3Ds[j].X,
22                 frame.Point3Ds[j].Y,
23                 frame.Point3Ds[j].Z);
24         }
25     }
26 }

GB2312字符集里面 6763 字之外的字眼加入消序置后

既然GB2312常用的6763只字占了众人时时因此汉字的99.7%,那即便拿未是就中的字往后放放吧。

新近实验室设本人修改C3D(The 3D Biomechanics Data
Standard)文件,虽然从网上找到了一个为c3d4sharp的类库,这个类库单纯读取C3D文件之口舌还好,但是一旦假定促成修改或创造C3D文件就较辛苦了。同时c3d4sharp实现得比较简单,很多C3D文件里片数据都非支持。好于C3D文件总体不是格外复杂,于是自己虽起来再勾了一个C3D文件读写的库房,现在当codeplex上创设了个门类被C3D.NET。

 

前面说了如此多,其实要因此C3D.NET来分析的语实际是非常简单的。大家可于https://c3d.codeplex.com/下载C3D.NET之二进制文件要源码,引用后第一的类似都于C3D这个命名空间下。

参数内容维数(0-3)

倘读取模拟采样的话,采用的方式也类似:

【二、C3D文件头的结构】

C3D文件没有确定一个参数组后边和其余一个参数组还是跟该参数组里的富有参数,所以读取的时光要小心下。而参数的始末则跟参数组基本等同,只是在产一致参数组/参数的舞狮与参数组描述长度之间存放着该参数的实际上数目罢了,由于位置描述起来最好费事了,这里虽未写了。

 

【相关链接】

对此开创一个C3D文件,只需要用C3DFile.Create()就足以创建一个空的C3D文件之,不含有其他的参数集合。而保存C3D文件则一直行使file.SaveTo(“文件路径”)就得了。

 

  • 对于每帧的3D坐标点部分,存储着该帧所有3D坐标点的数码,每个3D坐标点包括4单Int16或Single数据,分别是X坐标、Y坐标、Z坐标以及Residual和Camera
    Mask,其中Residual和Camera
    Mask共占一个Int16。比较有趣的是,对于浮点帧,Residual和Camera
    Mask仍然为要一个Int16,只不过存储的当儿如果以相应之数值转换为Single再展开仓储。

    • 对浮点帧,存储的X、Y、Z坐标就是其实的坐标;而对此整数幅,存储的X、Y、Z的坐标还索要倍加比例因子才方可,比例因子存储于参数集合中的”POINT”参数组中的”SCALE”参数。
    • Residual和Camera
      Mask共占一个Int16,将那易为字节数组之后,高位字节(第1个字节)的最高位表示Residual的符,即意味着该坐标点是否管用,如果也0虽说表示中,如果为1虽象征无效,而余下的7独字节则为Camera
      Mask,每一样各代表一个摄影机,从没有到高位分别代表7只摄像机是否用(为1啊以,为0啊不下)。而Residual的真数据则也字节数组的第0许节乘以比例因子(浮点帧则为比例因子的绝对值)。
  • 万一仿照采样部分,则存储着该帧所有的套采样的数码,不过每个帧可能含多只拟采样,同时每个模仿采样可能同时噙多单channel,存储的数量就为该channel下记录的数目。不过存储的数码以及实际的数额还待依据下述公式进行折算,其中data
    value为存储的数据,real world value为实际的数量。

    • zero
      offset可以从”ANALOG”参数组被之”OFFSET”中取,该数量吧Int16的勤组,第i各据的就算是第i个channel的zero
      offset。
    • channel
      scale可以由”ANALOG”参数组吃之”SCALE”中赢得,该数量为Single的频繁组,第i各拄的便是dii个channel的scale。
    • general
      scale是持有拟采样都需要倍加的比例,该数据可于”ANALOG”参数组吃的”GEN_SCALE”中获取,为Single。

    real world value = (data value – zero offset) channel scale general scale

后的情节

Byte

在此之后的老二有,也就是是储存的风波,听上应该占据多字节,但是出于限了轩然大波数量极其多不能够超过18只,同时事件名称最为丰富为4字节,所以事件有吗就占好少之空间。由于C3D主要是为记录运动的数据,可能以里面起那么些比重要之地方,事件就是用来标记出这些地方的。一个风波包括三单内容,分别是极其丰富四字节的波名称、一字节的波是否相应出示的状态与一个四字节之单纯精度浮点数表示事件出现的年月。

 

 

此间需要验证的便是,由于参数可以存放数组,所以多了维数的标识,即当维数为0时,存放的情为Char、Byte、Int16、Single等易出之字节数组;而当维数为1时,存放的吗Char[]、Byte[]、Int16[]、Single[]顶转移出的字节数组,以此类推。而对数组的囤积,其实就算是数组每个元素依次展开仓储,而于多维数组,则是按行优先开展仓储的,比如三维数组,先囤Data[0,0,1]再存储Data[0,0,2],依次类推。

Byte[] 

对此每个帧,又带有两只有,第一片为3D坐标点部分,第二组成部分也法采样部分。

 

字节 类型 说明
00H Byte 第一个参数所在的Section在整个参数集合中的位置(通常为0x01,说明开头4字节之后就是第一个参数)
01H Byte 参数集合部分标识(固定为0x50)
02H Byte 参数集合所占Section数量
03H Byte 生成文件的CPU类型(0x54为Intel,0x55为DEC (VAX, PDP-11),0x56为MIPS (SGI/MIPS))

对此遍历所有的3D坐标可以运用以下的方式,首先得从文本或者从流中创建C3D文件,然后由文本头被读取存储的第1幅的序号,然后读取采样点的数目就可以了,当然为可以不由参数组被读取,直接动用file.AllFrames[i].Point3Ds.Length也可以:

本,也堪以C3DPoint3DData数组换成C3DAnalogSamples数组,或者双方同时丰富也得以。

  1. C3D.ORG:http://www.c3d.org/
  2. c3d4sharp – C3D File reading/writing tools written in
    C#:http://code.google.com/p/c3d4sharp/
  3. C3D.NET:https://c3d.codeplex.com/

 

但C3D也出不行复杂的地方,一个是关于整型的采用,可以采用下产生记号的(Int16),也可行使无符号的(UInt16),只不过后者会积存的数据量要多一些耳,既然这样,不知何故当初还要使产生标志的整型。而且最好着重之凡,文档内没其他标识能指出文档使用的凡何种整型。官方给来的解决措施是,可以依据例如帧总数、帧索引等看清,如果念来负数,则以无符号的,否则用产生记号的。

Int16

 1 C3DFile file = C3DFile.LoadFromFile("文件路径");
 2 Int16 firstFrameIndex = file.Header.FirstFrameIndex;
 3 Int16 pointCount = file.Parameters["POINT:USED"].GetData<Int16>();
 4 
 5 for (Int16 i = 0; i < file.AllFrames.Count; i++)
 6 {
 7     for (Int16 j = 0; j < pointCount; j++)
 8     {
 9         Console.WriteLine("Frame {0} : X = {1}, Y = {2}, Z = {3}",
10             firstFrameIndex + i,
11             file.AllFrames[i].Point3Ds[j].X,
12             file.AllFrames[i].Point3Ds[j].Y ,
13             file.AllFrames[i].Point3Ds[j].Z);
14     }
15 }

Byte[]

【题外话】

只要对于Intel和MIPS生成的文档,对于浮点数字之贮存都是利用标准的IEEE754浮点数字,对于.NET而言不需要开展其它处理;而DEC生成的文档则以特有浮点数,需要拿4个字节全部读取以后再次进行特殊的变,转换方法见我之前的篇章:http://www.cnblogs.com/mayswind/p/3365594.html。

 

【五、使用C3D.NET读写文件示例】

对参数组,要存储以下6独内容:

 

1 //首先需要添加参数集合,ID为正数
2 file.Parameters.AddGroup(1, "POINT", "");
3 //然后往指定ID的参数集合中添加参数即可
4 file.Parameters[1].Add("USED", "").SetData<Int16>(5);
1 file.AllFrames.Add(new C3DFrame(new C3DPoint3DData[] {
2     new C3DPoint3DData() { X = x, Y = y, Z = z, Residual = residual, CameraMask = cameraMask},
3     new C3DPoint3DData() { X = x, Y = y, Z = z, Residual = residual, CameraMask = cameraMask},
4     new C3DPoint3DData() { X = x, Y = y, Z = z, Residual = residual, CameraMask = cameraMask},
5     new C3DPoint3DData() { X = x, Y = y, Z = z, Residual = residual, CameraMask = cameraMask},
6     new C3DPoint3DData() { X = x, Y = y, Z = z, Residual = residual, CameraMask = cameraMask} }));

类型

C3D文件存储了大气之参数,其用了近似目录的章程囤了参数,不过还吓不过出一级。即参数有只有参数组和参数,并且每个参数组里只能有参数不能够重新包含参数组,每个参数必须于一个参数组内。参数集合起始于文件头中的率先独字节表示的Section
ID,通常也2,但是呢不自然,有的文件会于文件头晚留起空白,然后参数集合起始的Section
ID就延期了。所以判断是否为C3D文件千万不要同开始念上个Int16然后判断是免是0x5002,而早晚要是咬定第二独字节是匪是0x50,确定参数集合的职位为势必要依据文件的第一字节来。

字节

参数存放内容的花色(-1 Char,1 Byte,2
Int16,4 Single),绝对值即为长

 

 

Byte

率先说C3D文件整体不是甚复杂,也没有多扑朔迷离的概念,C3D的文档格式可以从该官网下载或在线阅读。首先C3D文件是因Section为单位存储的,每一个Section固定啊512字节。Section一定是据顺序存储的,不过有意思的是,Section的序号是从1开始之,而无是0。C3D文件分为三局部,分别是Section
ID = 1的C3D文件头(固定啊一个Section,512字节),Section
ID一般等2(在文件头内会叫来)的C3D参数集合以及Section
ID不明白当几(在文书头和参数集合中都见面于有)的C3D数据有。

  1. C3D文件格式的布局
  2. C3D文件头的构造
  3. C3D文件参数集合的组织
  4. C3D文件数量区域之结构
  5. 运用C3D.NET读写文件示例

对于Intel和DEC生成的文档,都是用Little-Endian字节序存储的文档,所以自然要动用Little-Endian来读取Int16、Single等类别;而MIPS则运用的Big-Endian字节序存储文档,所以于读取的时光自然要是认清当前电脑默认的许节序以及文档采用的配节序。

 1 Single frameRate = file.Parameters["POINT", "RATE"].GetData<Single>();
 2 Int16 analogChannelCount = file.Parameters["ANALOG", "USED"].GetData<Int16>();
 3 Int16 analogSamplesPerFrame = (Int16)(file.Parameters["ANALOG", "RATE"].GetData<Int16>() / frameRate);
 4 
 5 for (Int16 i = 0; i < file.AllFrames.Count; i++)
 6 {
 7     for (Int16 j = 0; j < analogChannelCount; j++)
 8     {
 9         for (Int16 k = 0; k < analogSamplesPerFrame; k++)
10         {
11             Console.WriteLine("Frame {0}, Sample {1} : {2}",
12                 firstFrameIndex + i, j + 1,
13                 file.AllFrames[i].AnalogSamples[j][k]);
14         }
15     }
16 }
字节 类型 说明
00H Byte 参数集合开始的Section ID(通常为0x02,但也不一定)
01H Byte 文件标识(固定为0x50)
02H-03H Int16 每帧里3D坐标点的个数
04H-05H Int16 每帧里模拟测量的个数
06H-07H Int16 第1帧的序号(最小为1)
08H-09H Int16 最后1帧的序号
0AH-0BH Int16 最大插值差距
0CH-0FH Single 比例因子(正数表示存储的帧为整数帧,负数为浮点帧)
10H-11H Int16  数据区域开始的Section ID
12H-13H Int16 每帧模拟采样个数
14H-17H Single 帧率

在这个之下就囤方拥有的参数了,参数分为两像样,分别是参数组和参数。

 

可是用证明的凡,对于Char[]以及Char[,]立即有限种,如果表示的讲话实际应当相应之凡String以及String[]。

加加帧可以采取如下的代码:

率先来说第一片,也不怕是C3D的公文头,C3D的文件头一定就占1只Section,即定位的512字节,所以一旦读取前512字节就好把全路头数据获得到了。虽然每个Section有512字节的多,但是对于C3D的文件头就占了老大少之等同有的,在文件头着来恢宏空的区域。其中第一片凡是文本头参数有,内容如下:

字节 类型 说明
12AH-12BH Int16 事件名是否支持4字节(支持为0x3039,不支持为0)
12CH-12DH Int16 事件数量(最大为18)
130H-176H Single[] 按事件顺序存储的每个事件发生的时间(第1个帧为0.0s)
178H-188H Byte[] 按事件顺序存储的每个事件是否应该显示(1为显示,0为不显示)
18CH-1D2H Char[] 按事件顺序存储的每个事件的名称(每个事件占4字节)

Byte

【文章索引】

之前的内容

参数每一样维大小(如果维数为0,就不曾这个部分)

 

字节 类型 说明
00H SByte 参数组名称长度(如果为负数则表示该参数组锁定请不要修改,而长度为绝对值)
01H SByte 参数组ID的负数
02H – … Char[] 参数组名称(仅包含大写字母、0-9以及下划线_)
… + 1 – … + 2 Int16 下一参数组/参数的偏移(包含本内容的2字节)
… + 3 Byte 参数组描述长度
… + 4 –  Char[] 参数组描述内容(ASCII码)

【一、C3D文件格式的构造】

C3D数据区域为帧为单位寄放的,其实一定给之区域就是一个轴的会师。而C3D帧其实分为两种,一种是整数轴,而其他一样种植是浮点帧。这两者的区别在于,前者存储的具备情节都是Int16,而后人则也Single,除此之外,前者的3D坐标点(X、Y、Z)还需倍加比例因子才足以,而后者存储的始末相当给已经乘机以了百分比因子了。

【四、C3D文件数量区域之结构】

下同样参数组/参数的偏移(包含本内容之2字节)

说明

对于增长参数集合好应用以下的代码: