我正在尝试循环读取值的字节数组(下面的示例),然后将这些值插入数据库
我循环跟踪位置
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}
答案 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失败。