在 Objective-C / C 中读取 9 位、10 位或 11 位(精确)块中的数据并转换为整数
我正在读取以 9 位二进制形式保存的没有空格的测量数据,例如
101001110 001011100 001101010 101010110 100001011 等。
数据来自旧的测量设备,有时,我必须以例如 10、11 或12 位。我将始终知道要读取的整数大小,因为文件开头有一些文件信息。
但在 iOS / Objective-C 中,我只知道如何将二进制数据减小到 8 位字节的大小,例如 Int8、int16 等。并将这些 8 位或 16 位块转换为整数。
如何以按位预定义步骤逐步执行 NSData 对象?
I'm reading measurement data that is saved in 9 bit binary form with no spacing, e.g.
101001110 001011100 001101010 101010110 100001011 etc.
The data is from old measurement equipment, and sometimes, I have to read in chunks of e.g. 10, 11, or 12 bits. I will always know what integer size to read as there's some file info in the beginning of the file.
But in iOS / Objective-C I know only how to get binary data down to the size of 8 bit bytes, e.g. Int8, int16 etc. And convert those 8- or 16-bit chunks to integers.
How do I step through say an NSData object in bit-wise predefined steps?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您必须编写自己的反序列化器。例如:
并且:
全部未经测试,但希望是正确的。请注意,我正在计算 NSUInteger 中的位,从内存来看,iOS 下它的宽度为 32 位,因此它可以处理的最大文件大小为 512mb。如果您想要达到 2 艾字节,您可以显式使用 64 位长。
显然接下来要添加的是一个布尔 getter,用于判断流是否完成。
You'd have to write your own deserialiser. For example:
And:
All untested, but hopefully correct. Notice that I'm counting bits in an NSUInteger, which from memory are 32 bits wide under iOS so the maximum file size it can cope with is 512mb. You could explicitly use a 64 bit long long if you wanted to go to 2 exabytes.
The obvious next thing to add would be a Boolean getter for whether the stream is finished.
如果您知道文件是全 9 位、全 10 位或全 11 位值,那么我可能要做的就是编写三个单独的算法来提取这些长度的数据,而不是尝试编写一个“通用”例程。大多数情况下,您可以通过为每个值使用 8 种可能的对齐方式使用 switch 语句来处理给定大小的逻辑。
If you know the file is either all 9, all 10, or all 11 bit values, the thing I'd probably do is write three separate algorithms to extract the data in those lengths, vs trying to write a "generic" routine. Mostly you can handle the logic for a given size by having a switch statement for the 8 possible alignments for each value.