增加字节数组中的char

时间:2015-08-28 01:27:52

标签: c# .net byte buffer unsafe

我预先填充了一个字节数组:

 private static byte[] idBuffer = ASCIIEncoding.Default.GetBytes("A" + DateTime.Now.ToString("yy") + DateTime.Now.DayOfYear + "0000001");

" 0000001"每次我调用"增量"方法

例如,增量序列样本将是:

000000S
...
00000S0
00000S1
...
00000SS
...
0000S00
...
0000S99
0000S9A

我在使用正确的算法/状态机时遇到了一些麻烦,无法正确增加字符数。

现在我预先填写了一张char表:

private static byte[] charCodes = new byte[] { 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 80, 81, 82, 83};

和我对国家机器的粗暴尝试,但它只让我到了第二个位置:

if (idBuffer[bufPosition] < 83)
{
    idBuffer[bufPosition] = charCodes[charCodePosition];
    charCodePosition++;
}
else
{
    if (idBuffer[bufPosition - 1] == 48)
    {
        for (int i = bufPosition; i < idBuffer.Length; i++)
            idBuffer[i] = 48;

        idBuffer[bufPosition - 1] = charCodes[charCodePosition2];
        charCodePosition2++;
    }
    else
    {
        charCodePosition2++;
        idBuffer[bufPosition - 1] = charCodes[charCodePosition2];
    }

    charCodePosition = 0;
}

我确信有一种更优雅的方式来做到这一点,我无法想到 - 理想情况下,如果有人知道如何用不安全的代码/指针做到这一点,那就更好了!

2 个答案:

答案 0 :(得分:3)

实际上非常简单:

  1. 从最后一个元素开始。
  2. 添加一个。
  3. 如果您现在有'0'+10(58),请将其调整为'A'(65)​​。
  4. 如果您有'T'以外的任何内容(懒得查找ASCII码),您就完成了。
  5. 调整为'0'(48)。
  6. 左移一个元素并从第2步开始重复进行。

答案 1 :(得分:1)

基于Ben Voigt answer,你想要酷的事实(假设更喜欢<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <select name="product"> <option>select</option> <option value="1">A</option> <option value="2">B</option> <option value="3">C</option> </select> <table id="ListProduct"> <tr data-id="1"><td>A</td></tr> <tr data-id="4"><td>D</td></tr> <tr data-id="5"><td>E</td></tr> <tr data-id="6"><td>F</td></tr> <tr data-id="7"><td>G</td></tr> </table>的目标)代码和固定大小的数字,你可以将整个代码展开到简单的状态机:

unsafe

&#39; A&#39; - &#39; C&#39;的近似代码为0,1,3。如果表合并为一个表(即将char和index组合成单个{number-to-add, char} -> {incremented char, carry} 值并进行位移),则可能会略微简化。

uint