Skip to content

Commit

Permalink
Merge pull request #14 from DigitalPlatform/master
Browse files Browse the repository at this point in the history
同步源
  • Loading branch information
renyh authored Dec 31, 2018
2 parents 5414767 + 9790701 commit ef23f4a
Show file tree
Hide file tree
Showing 10 changed files with 650 additions and 101 deletions.
263 changes: 227 additions & 36 deletions DigitalPlatform.RFID/ChipMemory.cs

Large diffs are not rendered by default.

24 changes: 23 additions & 1 deletion DigitalPlatform.RFID/Compact.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,27 @@ namespace DigitalPlatform.RFID
{
public class Compact
{
public static CompactionScheme AutoSelectCompactMethod(
ElementOID oid,
string text)
{
if (oid == ElementOID.Title)
return CompactionScheme.Utf8String;

if (CheckInteger(text, false))
return CompactionScheme.Integer;
if (CheckNumeric(text, false))
return CompactionScheme.Numeric;
if (CheckBit5(text, false))
return CompactionScheme.FivebitCode;
if (CheckBit6(text, false))
return CompactionScheme.SixBitCode;
if (CheckBit7(text, false))
return CompactionScheme.SevenBitCode;

return CompactionScheme.Null; // 无法自动选择
}

public static CompactionScheme AutoSelectCompactMethod(string text)
{
if (CheckInteger(text, false))
Expand All @@ -22,7 +43,8 @@ public static CompactionScheme AutoSelectCompactMethod(string text)
return CompactionScheme.SixBitCode;
if (CheckBit7(text, false))
return CompactionScheme.SevenBitCode;
return CompactionScheme.Null;

return CompactionScheme.Null; // 无法自动选择
}

#region Integer
Expand Down
99 changes: 78 additions & 21 deletions DigitalPlatform.RFID/Element.cs
Original file line number Diff line number Diff line change
Expand Up @@ -296,19 +296,20 @@ public static byte[] Compact(int oid,
Precursor precursor = new Precursor();
precursor.ObjectIdentifier = oid;

if (oid == (int)ElementOID.ContentParameter)
compact_method = CompactionScheme.OctectString;
else if (oid == (int)ElementOID.OwnerInstitution
|| oid == (int)ElementOID.IllBorrowingInstitution)
compact_method = CompactionScheme.ISIL;

// 自动选定压缩方案
if (compact_method == CompactionScheme.Null)
{
compact_method = RFID.Compact.AutoSelectCompactMethod(text);
compact_method = RFID.Compact.AutoSelectCompactMethod((ElementOID)oid, text);
if (compact_method == CompactionScheme.Null)
throw new Exception($"无法为字符串 '{text}' 自动选定压缩方案");
throw new Exception($"无法为字符串 '{text}' (oid='{(ElementOID)oid}') 自动选定压缩方案");
}

if (compact_method == CompactionScheme.ISIL)
precursor.CompactionCode = (int)CompactionScheme.ApplicationDefined;
else
precursor.CompactionCode = (int)compact_method;

byte[] data = null;
if (compact_method == CompactionScheme.Integer)
data = RFID.Compact.IntegerCompact(text);
Expand All @@ -331,6 +332,14 @@ public static byte[] Compact(int oid,
else if (compact_method == CompactionScheme.Base64)
data = Convert.FromBase64String(text);

if (oid == (int)ElementOID.ContentParameter)
compact_method = 0;

if (compact_method == CompactionScheme.ISIL)
compact_method = (int)CompactionScheme.ApplicationDefined;

precursor.CompactionCode = (int)compact_method;

// 通过 data 计算出是否需要 padding bytes
int total_bytes = 1 // precursor
+ 1 // length of data
Expand All @@ -339,9 +348,12 @@ public static byte[] Compact(int oid,
total_bytes++; // relative-OID 需要多占一个 byte

int paddings = 0;
if ((total_bytes % 4) != 0)
if (alignment)
{
paddings = 4 - (total_bytes % 4);
if ((total_bytes % 4) != 0)
{
paddings = 4 - (total_bytes % 4);
}
}

// 组装最终数据
Expand Down Expand Up @@ -489,6 +501,8 @@ public static Element Parse(byte[] data,
// parameters:
// data 待加工的数据
// delta 变化数。可以是负数。表示增加或者减少这么多个 bytes 的 padding 字符
// exception:
// 可能会抛出 Exception 或 PaddingOverflowException
public static byte[] AdjustPaddingBytes(byte[] data, int delta)
{
if (delta == 0)
Expand Down Expand Up @@ -553,10 +567,11 @@ public static byte[] AdjustPaddingBytes(byte[] data, int delta)
{
result.Add(0);
}
// TODO: 检查 byte 值是否溢出
// TODO: 是否有办法预先知道多大的 delta 值会溢出?
// 检查 byte 值是否溢出
// 有办法预先知道多大的 delta 值会溢出
if (result[1] + delta > byte.MaxValue)
throw new Exception($"Padding Length 原值为 {result[1]},加上 {delta} 以后发生了溢出");
throw new PaddingOverflowException($"Padding Length 原值为 {result[1]},加上 {delta} 以后发生了溢出",
byte.MaxValue - result[1]);
// 修改 Padding Length 位
result[1] = (byte)(result[1] + delta);
result.AddRange(more);
Expand All @@ -573,6 +588,9 @@ public static byte[] AdjustPaddingBytes(byte[] data, int delta)
result.Add(0);
}
}
// 2) Offset bit 设置为 1
result[0] |= 0x80;

result.AddRange(more);
return result.ToArray();
}
Expand Down Expand Up @@ -611,7 +629,8 @@ public static byte[] AdjustPaddingBytes(byte[] data, int delta)
}

// 加工前没有 padding 的情况
throw new Exception($"delta 值为 {delta} 但原始数据中并没有 padding 可以去除");
throw new PaddingOverflowException($"delta 值为 {delta} 但原始数据中并没有 padding 可以去除",
0);
}

// 获得 element 用到的填充 byte 个数
Expand Down Expand Up @@ -662,7 +681,9 @@ public static int GetTotalLength(byte[] data)

public override string ToString()
{
string compacted = Convert.ToString(this._precursor.CompactionCode, 2).PadLeft(3, '0');
string compacted = "";
if (this._precursor != null)
compacted = Convert.ToString(this._precursor.CompactionCode, 2).PadLeft(3, '0');
string bin = GetHexString(this.Content);
if (this.OID == ElementOID.ContentParameter)
{
Expand Down Expand Up @@ -691,20 +712,44 @@ public static string GetContentParameterDesription(byte[] data)
return string.Join(",", names.ToArray());
}



// 得到用16进制字符串表示的 bin 内容
public static string GetHexString(byte[] baTimeStamp)
public static string GetHexString(byte[] baTimeStamp, string format = "")
{
if (baTimeStamp == null)
return "";
StringBuilder text = new StringBuilder();
for (int i = 0; i < baTimeStamp.Length; i++)
if (string.IsNullOrEmpty(format))
{
//string strHex = String.Format("{0,2:X}",baTimeStamp[i]);
string strHex = Convert.ToString(baTimeStamp[i], 16);
text.Append(strHex.PadLeft(2, '0'));
StringBuilder text = new StringBuilder();
for (int i = 0; i < baTimeStamp.Length; i++)
{
//string strHex = String.Format("{0,2:X}",baTimeStamp[i]);
string strHex = Convert.ToString(baTimeStamp[i], 16);
text.Append(strHex.PadLeft(2, '0'));
}

return text.ToString();
}

return text.ToString();
// 每行四个 byte
if (format == "4")
{
StringBuilder text = new StringBuilder();
for (int i = 0; i < baTimeStamp.Length; i++)
{
string strHex = Convert.ToString(baTimeStamp[i], 16);
text.Append(strHex.PadLeft(2, '0'));
if ((i % 4) <= 2)
text.Append(" ");
if ((i % 4) == 3)
text.Append("\r\n");
}

return text.ToString();
}
else
throw new Exception($"未知的风格 '{format}'");
}

// 得到 byte[]类型 内容
Expand All @@ -713,6 +758,8 @@ public static byte[] FromHexString(string strHexTimeStamp)
if (string.IsNullOrEmpty(strHexTimeStamp) == true)
return null;

strHexTimeStamp = strHexTimeStamp.Replace(" ", "").Replace("\r\n", "").ToUpper();

byte[] result = new byte[strHexTimeStamp.Length / 2];

for (int i = 0; i < strHexTimeStamp.Length / 2; i++)
Expand Down Expand Up @@ -788,4 +835,14 @@ public byte ToByte()
}
}

// 填充字节溢出异常
public class PaddingOverflowException : Exception
{
public int MaxDelta { get; set; }

public PaddingOverflowException(string message, int max_delta) : base(message)
{
this.MaxDelta = max_delta;
}
}
}
12 changes: 6 additions & 6 deletions StackRoomEditor/StackRoomEditor.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -238,32 +238,32 @@
<ItemGroup>
<PublishFile Include="default_models.xml">
<Visible>False</Visible>
<PublishState>DataFile</PublishState>
<IncludeHash>True</IncludeHash>
<Group>
</Group>
<TargetPath>
</TargetPath>
<PublishState>DataFile</PublishState>
<IncludeHash>True</IncludeHash>
<FileType>File</FileType>
</PublishFile>
<PublishFile Include="ground_cell.bmp">
<Visible>False</Visible>
<PublishState>Exclude</PublishState>
<IncludeHash>True</IncludeHash>
<Group>
</Group>
<TargetPath>
</TargetPath>
<PublishState>Exclude</PublishState>
<IncludeHash>True</IncludeHash>
<FileType>File</FileType>
</PublishFile>
<PublishFile Include="ground_grid.bmp">
<Visible>False</Visible>
<PublishState>Include</PublishState>
<IncludeHash>True</IncludeHash>
<Group>
</Group>
<TargetPath>
</TargetPath>
<PublishState>Include</PublishState>
<IncludeHash>True</IncludeHash>
<FileType>File</FileType>
</PublishFile>
</ItemGroup>
Expand Down
45 changes: 8 additions & 37 deletions TestDp2Library/TestRfid.cs
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,7 @@ public void Test_element_parse_1()
[TestMethod]
public void Test_element_compact_1()
{
byte [] result = Element.Compact(1,
byte[] result = Element.Compact(1,
"123456789012",
CompactionScheme.Null,
true);
Expand All @@ -414,7 +414,7 @@ public void test_logicChip_1()
{
// zhiyan 1
byte[] data = ByteArray.GetTimeStampByteArray("C102071100B0C30C30CA00000203A80008830203D6593F0000250110370210405F080599A713063F");
LogicChip chip = LogicChip.From(data);
LogicChip chip = LogicChip.From(data, 4);
Debug.Write(chip.ToString());
}

Expand All @@ -423,7 +423,7 @@ public void test_logicChip_2()
{
// zhiyan 2
byte[] data = ByteArray.GetTimeStampByteArray("C102071100B0C30C30D600000203A80008830203D6593F0000250110370210405F080599A713063F");
LogicChip chip = LogicChip.From(data);
LogicChip chip = LogicChip.From(data, 4);

}

Expand All @@ -432,31 +432,31 @@ public void test_logicChip_3()
{
// jiangxi jingyuan 1
byte[] data = ByteArray.GetTimeStampByteArray("11030AA8AE0000000000000000000000000000000000000000000000000000000000000000000000");
LogicChip chip = LogicChip.From(data);
LogicChip chip = LogicChip.From(data, 4);
}

[TestMethod]
public void test_logicChip_4()
{
// jiangxi jingyuan 2
byte[] data = ByteArray.GetTimeStampByteArray("11030AA9770000000000000000000000000000000000000000000000000000000000000000000000");
LogicChip chip = LogicChip.From(data);
LogicChip chip = LogicChip.From(data, 4);
}

[TestMethod]
public void test_logicChip_5()
{
//
byte[] data = ByteArray.GetTimeStampByteArray("C102071100B0C30C30C600000203A80008830203D6593F0000250110370210405F080599A713063F");
LogicChip chip = LogicChip.From(data);
LogicChip chip = LogicChip.From(data, 4);
}

[TestMethod]
public void test_logicChip_6()
{
// ganchuang 1
byte[] data = ByteArray.GetTimeStampByteArray("9101040142214B000201B80300650110660100670100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
LogicChip chip = LogicChip.From(data);
LogicChip chip = LogicChip.From(data, 4);
Debug.Write(chip.ToString());

}
Expand All @@ -466,41 +466,12 @@ public void test_logicChip_7()
{
// ganchuang 2
byte[] data = ByteArray.GetTimeStampByteArray("91020312D68700000201B80300650110660100670100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
LogicChip chip = LogicChip.From(data);
LogicChip chip = LogicChip.From(data, 4);
Debug.Write(chip.ToString());

}

#endregion

#region layout

[TestMethod]
public void Test_chip_layout_1()
{
byte[] data = ByteArray.GetTimeStampByteArray(
@"91 00 05 1c
be 99 1a 14
02 01 d0 04
02 04 b3 46
07 44 1c b6
e2 e3 35 d6
83 02 07 ac
c0 9e ba a0
6f 6b 00 00".Replace(" ", "").Replace("\r\n", "").ToUpper()
);


LogicChip chip = LogicChip.From(data);
Debug.Write(chip.ToString());

chip.Elements[0].SetLocked(true);
chip.Elements[4].SetLocked(true);

chip.SetIsNew(false);
chip.Sort(4 * 9, 4);
}

#endregion
}
}
20 changes: 20 additions & 0 deletions UnitTestRFID/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[assembly: AssemblyTitle("UnitTestRFID")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("UnitTestRFID")]
[assembly: AssemblyCopyright("Copyright © 2018")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

[assembly: ComVisible(false)]

[assembly: Guid("4755b20f-d9af-4ccf-8b85-1a9b7313008e")]

// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
Loading

0 comments on commit ef23f4a

Please sign in to comment.