读取字节数组中的空值c#

时间:2012-02-24 12:26:37

标签: c#

我正在尝试循环读取值的字节数组(下面的示例),然后将这些值插入数据库

我循环跟踪位置

byte[] data;
position = Conversion.Extract(data, out mydata, position);
position = Conversion.Extract(data, out nextitem, position);

我的数据包含一些空值,如何提取这些值并成功移动到下一个值。目前,如果我遇到一个空值我不知道如何检测这个并转到下一个项目。任何人都可以提供帮助

提取代码为:

byte[] data;
long position=0;
while (position < data.Length)
{
    position = Conversion.Extract(data, out mydata, position);
    position = Conversion.Extract(data, out nextitem, position);
}

public static long Extract(byte[] message, out int variable, long position)
{
    const int length = 4; // the length of an int

    if (message.Length >= position + length)
    {
        variable = BitConverter.ToInt32(message, (int)position);
        return position + length;
    }

    variable = 0;
    return -1;
}

由于

西蒙

6F 72 67 61 6E 69 73 61 74 69 6F 6E 49 64 3D 33
26 10 00 00 00 50 65 6F 70 6C 65 50 65 6F 70 6C
65 4C 69 6E 6B 6A 08 00 00 09 00 00 00 0E 00 00
00 53 65 6E 69 6F 72 50 65 72 73 6F 6E 49 64 0E
00 00 00 4A 75 6E 69 6F 72 50 65 72 73 6F 6E 49
64 11 00 00 00 53 65 6E 69 6F 72 50 65 72 73 6F
6E 4D 69 73 49 64 11 00 00 00 4A 75 6E 69 6F 72
50 65 72 73 6F 6E 4D 69 73 49 64 08 00 00 00 4C
69 6E 6B 54 79 70 65 16 00 00 00 50 61 72 65 6E
74 61 6C 52 65 73 70 6F 6E 73 69 62 69 6C 69 74
79 08 00 00 00 50 72 69 6F 72 69 74 79 0B 00 00
00 4C 61 73 74 55 70 64 61 74 65 64 07 00 00 00
44 65 6C 65 74 65 64 01 00 00 00 D7 0A 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 01 80 C3 29
C6 85 BF CE 08 00 02 00 00 00 3C 0C 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 F0 83 76 C6
85 BF CE 08 00 03 00 00 00 3C 0C 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 C0 0E 76 C6 85
BF CE 08 00 04 00 00 00 67 0B 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 01 70 CA 4B C6 85 BF
CE 08 00 05 00 00 00 67 0B 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 02 70 CA 4B C6 85 BF CE
08 00 06 00 00 00 9B 08 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 02 C0 BE B2 C5 85 BF CE 08
00 06 00 00 00 AD 09 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 02 10 6D F5 C5 85 BF CE 08 00
06 00 00 00 3F 0A 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 02 80 59 11 C6 85 BF CE 08 00 07
00 00 00 E3 0A 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 01 C0 D0 2C C6 85 BF CE 08 00 08 00
00 00 9B 08 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 01 C0 BE B2 C5 85 BF CE 08 00 08 00 00
00 AD 09 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 01 10 6D F5 C5 85 BF CE 08 00 08 00 00 00
C9 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 01 20 76 FA C5 85 BF CE 08 00 08 00 00 00 3F
0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
01 B0 CE 11 C6 85 BF CE 08 00 09 00 00 00 E3 0A
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01
90 5B 2C C6 85 BF CE 08 00 0A 00 00 00 C9 09 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 20
76 FA C5 85 BF CE 08 00 0B 00 00 00 F6 08 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 01 E0 C9
D2 C5 85 BF CE 08 00 0C 00 00 00 F6 08 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 02 F0 2C C9
C5 85 BF CE 08 00 0E 00 00 00 91 09 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 01 C0 C7 EF C5
85 BF CE 08 00 0F 00 00 00 91 09 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 02 90 52 EF C5 85
SeniorPersonId | JuniorPersonId | SeniorPersonMisId | JuniorPersonMisId | LinkType | ParentalResponsibility | Priority | LastUpdated              Deleted
1              | 2775           | {null}            | {null}            | {null}   | 0                      | 1        | 2012-02-22 14:31:18.200 | {null}
2              | 3132           | {null}            | {null}            | {null}   | 0                      | {null}   | 2012-02-22 14:31:18.703 | {null}
3              | 3132           | {null}            | {null}            | {null}   | 0                      | {null}   | 2012-02-22 14:31:18.700 | {null}
4              | 2919           | {null}            | {null}            | {null}   | 0                      | 1        | 2012-02-22 14:31:18.423 | {null}

2 个答案:

答案 0 :(得分:0)

我将字节解码为ASCII并得到

"o", "r",  "g", "a", "n", "i", "s", "a", "t", "i", "o", "n", "I", "d", "=", "3", "&", "\x10", "\x00", "\x00", "\x00", 
"P", "e", "o", "p", "l", "e", "P", "e", "o", "p", "l", "e", "L", "i", "n", "k", "j", "\b", "\x00", "\x00", "\t", "\x00", "\x00", "\x00", "\x0E", "\x00", "\x00", "\x00", 
"S", "e", "n", "i", "o", "r", "P", "e", "r", "s", "o", "n", "I", "d", "\x0E", "\x00", "\x00", "\x00", 
"J", "u", "n", "i", "o", "r", "P", "e", "r", "s", "o", "n", "I", "d", "\x11", "\x00", "\x00", "\x00", 
"S", "e", "n", "i", "o", "r", "P", "e", "r", "s", "o", "n", "M", "i", "s", "I", "d", "\x11", "\x00", "\x00", "\x00", 
"J", "u", "n", "i", "o", "r", "P", "e", "r", "s", "o", "n", "M", "i", "s", "I", "d", "\b", "\x00", "\x00", "\x00", 
"L", "i", "n", "k", "T", "y", "p", "e", "\x16", "\x00", "\x00", "\x00", 
"P", "a", "r", "e", "n", "t", "a", "l", "R", "e", "s", "p", "o", "n", "s", "i", "b", "i", "l", "i", "t", "y", "\b", "\x00", "\x00", "\x00", 
"P", "r", "i", "o", "r", "i", "t", "y", "\v", "\x00", "\x00", "\x00", 
"L", "a", "s", "t", "U", "p", "d", "a", "t", "e", "d", "\a", "\x00", "\x00", "\x00", 
"D", "e", "l", "e", "t", "e", "d", 
"\x01", "\x00", "\x00", "\x00", "\xD7", "\x0A", "\x00", "\x00", "\x00", "\x00", ...

实际数据似乎是在"D", "e", "l", "e", "t", "e", "d",之后开始的 SeniorPersonId似乎是一个32位整数。我的基础是以下"\xD7", "\x0A", "\x00", "\x00" =&gt; 0x0AD7 =&gt; 2775,这与上例中的JuniorPersonId相同。

"\x01", "\x00", "\x00", "\x00", // SeniorPersonId
"\xD7", "\x0A", "\x00", "\x00", // JuniorPersonId = 2775
"\x00", "\x00", "\x00", "\x00", // SeniorPersonMisId
"\x00", "\x00", "\x00", "\x00", // JuniorPersonMisId
"\x00", "\x00", "\x00", "\x00", // LinkType
"\x00", // ParentalResponsibility
"\x01", // Priority
"\x80", "\xC3", ")", "\xC6", "\x85", "\xBF", "\xCE", "\b", // LastUpdated
"\x00", // Deleted
"\x02", "\x00", "\x00", "\x00", // SeniorPersonId
"\x3C", "\x0C", "\x00", "\x00", // JuniorPersonId = 3132
"\x00", "\x00", "\x00", "\x00", // SeniorPersonMisId
"\x00", "\x00", "\x00", "\x00", // JuniorPersonMisId
"\x00", "\x00", "\x00", "\x00", // LinkType
"\x00", // ParentalResponsibility
"\x00", // Priority
"\xF0", "\x83", "v", "\xC6", "\x85", "\xBF", "\xCE", "\b", // LastUpdated
"\x00", // Deleted

有根据的猜测是,如果该字段的所有字节都是0x00,则它为空。

这些字段的长度明显不同。你必须相应地解析它们。

以下是一个关于如何解析它的示例。

public class Person
{
    public int SeniorPersonId {get;set;}
    public int JuniorPersonId {get;set;}
    public int? SeniorPersonMisId {get;set;}
    public int? JuniorPersonMisId {get;set;}
    public int? LinkType {get;set;}
    public byte ParentalResponsibility {get;set;}
    public byte? Priority {get;set;}
    public DateTime LastUpdated {get;set;}
    public byte? Deleted {get;set;}
}

void Main()
{
    var message = new byte[] 
    {
        0x01, 0x00, 0x00, 0x00, // SeniorPersonId
        0xD7, 0x0A, 0x00, 0x00, // JuniorPersonId = 2775
        0x00, 0x00, 0x00, 0x00, // SeniorPersonMisId
        0x00, 0x00, 0x00, 0x00, // JuniorPersonMisId
        0x00, 0x00, 0x00, 0x00, // LinkType
        0x01, // ParentalResponsibility
        0x01, // Priority
        0x80, 0xC3, 0x29, 0xC6, 0x85, 0xBF, 0xCE, 0x08, // LastUpdated
        0x00, // Deleted
    };

    var person = new Person();
    int pos = 0;

    person.SeniorPersonId = BitConverter.ToInt32(message, pos);
    person.JuniorPersonId = BitConverter.ToInt32(message, pos + 4);
    person.SeniorPersonMisId = BitConverter.ToInt32(message, pos + 8);
    if (person.SeniorPersonMisId == 0) person.SeniorPersonMisId = null;
    person.ParentalResponsibility = message[pos + 20];
    person.LastUpdated = DateTime.FromBinary( BitConverter.ToInt64(message, pos + 22) );
}

创建一个人物对象:

SeniorPersonId 1
JuniorPersonId 2775
SeniorPersonMisId null  
JuniorPersonMisId null  
LinkType null  
ParentalResponsibility 1
Priority null  
LastUpdated 2012-02-22 14:31:18
Deleted null  

现在您只需添加其余属性并创建一个解析方法。我会留给你的。

答案 1 :(得分:0)

你的提取逻辑似乎很好,但return -1肯定会下次调用Extract。这可能是问题的根源。由于您在检查是否已经检查了数据之前调用Extract两次.Length,如果表中有Int32值,则可能有奇数 - 首先Extract返回-1并且下一次调用Extract失败。