C#的BinaryReader具有这样的功能,根据MSDN,读取编码为'7个整数’的整数,并且然后读出与该整数的长度的字符串.
是否有一个明确的七位整数格式文档(我粗略地了解MSB或LSB标记是否有更多字节要读取,其余位是数据,但我会很高兴更精确的东西).
更好的是,是否有C以这种格式读写数字的实现?
我有一个 100 的数组uint8_t,它被视为 800 位的流,并且一次处理 7 位。换句话说,如果 8 位数组的第一个元素成立0b11001100,第二个元素成立ob11110000,那么当我以 7 位格式读取它时,7 位数组的第一个元素将是0b1100110,第二个元素将0b0111100是其余 2 位保存在第 3 位中。我尝试的第一件事是工会...
struct uint7_t {
uint8_t i1:7;
};
union uint7_8_t {
uint8_t u8[100];
uint7_t u7[115];
};
Run Code Online (Sandbox Code Playgroud)
但当然,所有内容都是字节对齐的,我本质上最终只是丢失了每个元素的第 8 位。
有谁知道我该怎么做?
需要明确的是,这是联合结果的视觉表示:
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx8 位数据的 32 位
0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx7 位数据的 32 位。
这代表了我想做的事情:
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx8 位数据的 32 位
xxxxxxx xxxxxxx xxxxxxx xxxxxxx xxxx7 位数据的 32 位。
我知道最后的位可能会被填充,但这没关系,我只是想以某种方式一次访问每个字节 …
codecs.open()提到的文件
即使未指定二进制模式,文件也始终以二进制模式打开.这样做是为了避免因使用8位值进行编码而导致数据丢失.
如何在文件中使用文本模式导致"数据丢失"?听起来像在文本模式下打开文件可能会将字节截断为7位,但我在文档中找不到任何提及:文本模式仅被描述为转换换行符的方式,没有提及某些潜在的数据失利.那么,文档的内容codecs.open()是什么?
PS:虽然可以理解的是,依赖于平台的换行编码的自动换行需要一些小心,但问题是关于8位编码的具体内容.我猜想只有一些编码与自动换行转换兼容,无论它们是8位编码还是7位编码.那么,为什么在codecs.open()文档中挑出8位编码呢?
我正在尝试制作一种自定义midi播放器,为此我使用的数组已经正确记住了midi消息数据,如下所示:
int array[3000][4]={{time,status,data1,data2},{...},...}
Run Code Online (Sandbox Code Playgroud)
当我希望我的程序发送midi消息(以便可以播放)时,我调用此数组并在noteon/off,pitch-bend等之间进行必要的区分.弯音值(范围从0到16383,但通常约为8192,这意味着没有音调移位)全部存储在data1(array [i] [2])中.对于从int转换为两个7位值以传递给midiOutShortMsg(),我使用了一些我在这里找到的代码.这是我实际使用的代码:
union { unsigned long word; unsigned char data[4]; } message;
int main(int argc, char** argv) {
int midiport; // select which MIDI output port to open
uint16_t bend;
int flag,u; // monitor the status of returning functions
uint16_t mask = 0x007F;
HMIDIOUT device; // MIDI device interface for sending MIDI output
message.data[0] = 0x90;
message.data[1] = 60;
message.data[2] = 100;
message.data[3] = 0; // Unused parameter
// Assign the MIDI output port …Run Code Online (Sandbox Code Playgroud) 我一直在寻找2小时或更好的方法来使用Read7BitEncodedInt方法.我需要以某种方式使用它来减少我的文件大小(在这种情况下可能减少100mb或更多).我也在考虑使用ReadString方法,因为它似乎做了大致相同的事情.但这似乎不太合适,我不确定它会起作用.如果还有其他替代方案,我不知道我也愿意使用它.
总结.如何将Read7BitEncodedInt方法实现为以下代码?另外,我不太确定我的Write7BitEncodedInt方法也是正确的.
public void SaveFile()
{
using (FileStream stream = new FileStream("C:\\A_random.txt", FileMode.Create))
{
using (BinaryWriter writer = new BinaryWriter(stream))
{
for (int i = 0; i < typeCount.Count; i++)
{
writer.Write((byte)typeCount[i]);
writer.Write(type[i]);
}
writer.Close();
}
}
LoadFile();
}
public void LoadFile()
{
using (FileStream stream = new FileStream("C:\\A_random.txt", FileMode.Open))
{
using (BinaryReader reader = new BinaryReader(stream))
{
int i = 0;
while (stream.Position != stream.Length)
{
int count = reader.Read7BitEncodedInt();
byte val = reader.ReadByte();
for (int ii = 0; …Run Code Online (Sandbox Code Playgroud)