bmt*_*033 7 c# arrays parsing byte bytearray
我有一个1250字节长的固定长度字节数组.它可能包含以下类型的数据:
对象A由5个字节组成.第一个字节包含字母"A",接下来的四个字节存储1到100000的整数.
对象B由2个字节组成.第一个字节包含字母"B",下一个字节包含1到100的整数.
对象C由50个字节组成.所有50个字节用于存储ASCII编码的字符串,该字符串仅包含数字和以下字符: - +(和)
我不知道每个对象类型有多少在字节数组中,但我知道它们被组合在一起(对象B,对象B,对象A,对象A,对象A,对象C等).大多数情况下,当我解析一个字节数组时,该数组包含一种类型的数据(例如,所有项目都是对象A),所以我确切地知道每个项目包含多少字节,我只是循环处理字节的数组.在这种情况下,我有三种不同类型的数据,它们的长度都不同.我以为我需要做这样的事情:
int offset = 0;
while (offset <= 1250)
{
string objectHeader = Encoding.ASCII.GetString(byteArray, offset, 1);
if (objectHeader.Equals("A"))
{
// read 4 more bytes and then convert into int value (1 - 100000)
index += 5;
}
else if (objectHeader.Equals("B"))
{
// read 1 more byte and then convert into int value (1 - 100)
index += 2;
}
else
{
// read 49 more bytes and then convert into a string
index += 50;
}
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法呢?
好吧,似乎与偏移和索引有点混淆,也许你应该使用for循环:
for(int index = 0; index < 1250; index++)
{
switch(byteArray[index])
{
case (byte)'A':
index++;
int value = BitConverter.ToInt32(byteArray, index);
index += 4;
break;
case (byte)'B':
index++;
// Read the next byte as integer.
int value = (int)byteArray[index];
index++;
break;
case (byte)'C': // string.
index++;
// Read the next 49 bytes as an string.
StringBuilder value = new StringBuilder(49);
for(int i = index; i < index + 49; index++)
{
if (byteArray[i] == 0) break;
value.Append(Converter.ToChar(byteArray[i]));
}
index+= 49;
break;
case 0: // Finished.
index = 1250;
break;
default:
throw new InvalidArgumentException("Invalid byte array format");
}
}
Run Code Online (Sandbox Code Playgroud)
你如何看待没有更多的物体?在我的例子中,我建议它以'\ 0'结尾.
祝你好运.