ASCII格式 的没问题。 二进制的数据格式说明如下: 二进制STL文件用固定的字节数来给出三角面片的几何信息。 我如何读取各顶点坐标? ASCII格式的我可以通过逐行读取,然后再分析,但二进制格式的打开是乱码,不知道怎么读取。 谢谢。 |
|
5分 |
直接二进制读取,按照你的字段的含义解析成对应的变量
|
比如:UINT32//Numberoftriangles//三角面片数量 |
|
5分 |
用ultraedit比较下,另外,x86是big endian的,比如整数513(0x201),存储的是01 02 00 00,而不是00 00 02 01 |
5分 |
对于浮点数、整数,一种简单的解析方式是用BitConverter.ToDouble ToInt32等等,传入数组和偏移就可以了。
|
10分 |
一边二进制读取,一边打开Hex编辑器 比较数据。
Hex编辑器我一般用Notepad++家Hex 插件。 注意big endian 和 litter endian. 没有数据很难分析问题在哪里。 |
1、单精度浮点数的转换
var n = BitConverter.GetBytes(1f); Console.WriteLine(string.Join(",", n)); Console.WriteLine(BitConverter.ToSingle(n, 0)); 2、文件偏移是从 0 开始的 |
|
可以用BinaryReader来读取。
using (BinaryReader reader = new BinaryReader(File.OpenRead("data.stl"))) { reader.ReadBytes(80); // 文件头 reader.ReadUInt32(); // 三角面片个数 reader.ReadSingle(); // 读取顶点坐标 } |
|
5分 |
建议搜索一下STL文件的二进制格式,然后根据二进制根式读取数据
|
http://baike.baidu.com/link url=Et4vCIkMRgcITIJSqNucyjDslIRq8ZQQAaT7Fbj3wN1ZxbcsdCDYMgT9vloGrZct3q2hCkkf0IrrseX0aRjIn_
|
|
FileStream file = new FileStream(Server.MapPath(“3.stl”), FileMode.Open, FileAccess.Read);
BinaryReader read = new BinaryReader(file); byte[] head=read.ReadBytes(80); string str = System.Text.Encoding.Default.GetString(head); Response.Write(str + “<br>”);//文件头 int facecount=Convert.ToInt32(read.ReadUInt32()); // 三角面片个数
哪儿出问题呢? |
|
10分 |
你漏了 UINT16//Attributebytecountend//文件属性统计 没读
|
加上去了数据还是对不上,似乎不单单是这个原因,暂时还没搞明白。谢谢版主 |
|
10分 |
以下代码没有测试过
public class STLFile { public STLFile() { _triangles = new List<Triangle>(); } public string Name { get; set; } private List<Triangle> _triangles; public List<Triangle> Triangles { get { return _triangles; } } public static STLFile LoadBinary(string path) { using (BinaryReader reader = new BinaryReader(File.OpenRead(path))) { byte[] data; int count; data = reader.ReadBytes(80); count = (int)reader.ReadUInt32(); if (reader.BaseStream.Length != count * 50 + 84) throw new InvalidDataException("STL文件长度无效"); STLFile file = new STLFile(); file.Name = Encoding.Default.GetString(data); for (int i = 0; i < count; i++) { file.Triangles.Add(Triangle.Read(reader)); } return file; } } } public struct Coordinate { public float X; public float Y; public float Z; internal static Coordinate Read(BinaryReader reader) { Coordinate coor = new Coordinate(); coor.X = reader.ReadSingle(); coor.Y = reader.ReadSingle(); coor.Z = reader.ReadSingle(); return coor; } } public class Triangle { public Coordinate NormalVector { get; set; } public Coordinate Vertex1 { get; set; } public Coordinate Vertex2 { get; set; } public Coordinate Vertex3 { get; set; } public int Attributes { get; set; } internal static Triangle Read(BinaryReader reader) { Triangle triangle = new Triangle(); triangle.NormalVector = Coordinate.Read(reader); triangle.Vertex1 = Coordinate.Read(reader); triangle.Vertex2 = Coordinate.Read(reader); triangle.Vertex3 = Coordinate.Read(reader); triangle.Attributes = reader.ReadUInt16(); return triangle; } } STLFile.LoadBinary(“xxx.stl”); |
10分 |
1、int facecount = read.ReadUInt32(); // 三角面片个数
2、for (int i = 0; i < facecount; i++) { for (int j = 0; j < 3; j++) { v0 = read.ReadSingle(); // Response.Write(v0 + “ ”); } Response.Write(read.ReadUInt16() + “<br>”); } |
谢谢。已经解决了,还漏掉了前面的。 感谢各位热心人的支持! |
|
做一个延续吧。
如何判断 是以 ASCII 方式存储还是以二进制方式存储 |
|
先以十进制方式打开,然后验证文件长度,假如长度不匹配,再试着用文本方式读取。
|
|
没有更好的方法,除非文件格式存在固有的区别,你才能正确解析,否则肯定有误读情况出现
|
|
你做了跳字节了吗,写入的时候有没有跳字节,文件最大类型是4字节的,所以按4字节对齐,最前面读文件头,需要跳3个字节才继续读后面的数据
|
|
求楼主读取ASCII格式的程序,非常感谢
|