Skip to content

Commit c3d9d8b

Browse files
committed
Optimize DecToBin
1 parent 4bcfadb commit c3d9d8b

File tree

1 file changed

+23
-22
lines changed

1 file changed

+23
-22
lines changed

QRCoder/QRCodeGenerator.cs

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Text;
55
using System.Collections;
66
using System.Globalization;
7+
using System.Runtime.CompilerServices;
78

89
namespace QRCoder
910
{
@@ -154,12 +155,12 @@ public static QRCodeData GenerateQrCode(string plainText, ECCLevel eccLevel, boo
154155
var completeBitArrayIndex = 0;
155156
if (eciMode != EciMode.Default)
156157
{
157-
DecToBin((int)EncodingMode.ECI, 4, completeBitArray, ref completeBitArrayIndex);
158-
DecToBin((int)eciMode, 8, completeBitArray, ref completeBitArrayIndex);
158+
completeBitArrayIndex = DecToBin((int)EncodingMode.ECI, 4, completeBitArray, completeBitArrayIndex);
159+
completeBitArrayIndex = DecToBin((int)eciMode, 8, completeBitArray, completeBitArrayIndex);
159160
}
160-
DecToBin((int)encoding, 4, completeBitArray, ref completeBitArrayIndex);
161+
completeBitArrayIndex = DecToBin((int)encoding, 4, completeBitArray, completeBitArrayIndex);
161162
// write count indicator
162-
DecToBin(dataInputLength, countIndicatorLength, completeBitArray, ref completeBitArrayIndex);
163+
completeBitArrayIndex = DecToBin(dataInputLength, countIndicatorLength, completeBitArray, completeBitArrayIndex);
163164
// write data
164165
for (int i = 0; i < codedText.Length; i++)
165166
{
@@ -185,9 +186,8 @@ public static QRCodeData GenerateQrCode(byte[] binaryData, ECCLevel eccLevel)
185186
// Convert byte array to bit array, with prefix padding for mode indicator and count indicator
186187
var bitArray = ToBitArray(binaryData, prefixZeros: 4 + countIndicatorLen);
187188
// Add mode indicator and count indicator
188-
var index = 0;
189-
DecToBin((int)EncodingMode.Byte, 4, bitArray, ref index);
190-
DecToBin(binaryData.Length, countIndicatorLen, bitArray, ref index);
189+
var index = DecToBin((int)EncodingMode.Byte, 4, bitArray, 0);
190+
DecToBin(binaryData.Length, countIndicatorLen, bitArray, index);
191191

192192
return GenerateQrCode(bitArray, eccLevel, version);
193193
}
@@ -252,13 +252,13 @@ private static QRCodeData GenerateQrCode(BitArray bitArray, ECCLevel eccLevel, i
252252
{
253253
foreach (var codeBlock in codeWordWithECC)
254254
if (codeBlock.CodeWords.Length > i)
255-
DecToBin(codeBlock.CodeWords[i], 8, interleavedData, ref pos);
255+
pos = DecToBin(codeBlock.CodeWords[i], 8, interleavedData, pos);
256256
}
257257
for (var i = 0; i < eccInfo.ECCPerBlock; i++)
258258
{
259259
foreach (var codeBlock in codeWordWithECC)
260260
if (codeBlock.ECCWords.Length > i)
261-
DecToBin(codeBlock.ECCWords[i], 8, interleavedData, ref pos);
261+
pos = DecToBin(codeBlock.ECCWords[i], 8, interleavedData, pos);
262262
}
263263

264264
//Place interleaved data on module matrix
@@ -341,10 +341,12 @@ void WriteEccLevelAndVersion()
341341
default: // M: 00
342342
break;
343343
}
344-
int indexTemp = 2;
345-
DecToBin(maskVersion, 3, fStrEcc, ref indexTemp);
344+
DecToBin(maskVersion, 3, fStrEcc, 2);
346345
}
347346

347+
#if NETCOREAPP
348+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
349+
#endif
348350
void TrimLeadingZeros()
349351
{
350352
while (!fStrEcc[index])
@@ -384,10 +386,9 @@ private static void ShiftAwayFromBit0(BitArray fStrEcc, int num)
384386
private static BitArray GetVersionString(int version)
385387
{
386388
var vStr = new BitArray(18);
387-
var index = 0;
388-
DecToBin(version, 6, vStr, ref index);
389+
DecToBin(version, 6, vStr, 0);
389390
var count = vStr.Length;
390-
index = 0;
391+
var index = 0;
391392
while (!vStr[index])
392393
{
393394
index++;
@@ -406,8 +407,7 @@ private static BitArray GetVersionString(int version)
406407
ShiftTowardsBit0(vStr, index);
407408
vStr.Length = 12 + 6;
408409
ShiftAwayFromBit0(vStr, (12 - count) + 6);
409-
index = 0;
410-
DecToBin(version, 6, vStr, ref index);
410+
DecToBin(version, 6, vStr, 0);
411411
return vStr;
412412
}
413413

@@ -1043,7 +1043,7 @@ private static int BinToDec(BitArray bitArray, int offset, int count)
10431043
return ret;
10441044
}
10451045

1046-
private static void DecToBin(int decNum, int bits, BitArray bitList, ref int index)
1046+
private static int DecToBin(int decNum, int bits, BitArray bitList, int index)
10471047
{
10481048
// Convert decNum to binary using a bitwise operation
10491049
for (int i = bits - 1; i >= 0; i--)
@@ -1052,6 +1052,7 @@ private static void DecToBin(int decNum, int bits, BitArray bitList, ref int ind
10521052
bool bit = (decNum & (1 << i)) != 0;
10531053
bitList[index++] = bit;
10541054
}
1055+
return index;
10551056
}
10561057

10571058
private static int GetCountIndicatorLength(int version, EncodingMode encMode)
@@ -1136,7 +1137,7 @@ private static BitArray PlainTextToBinaryNumeric(string plainText)
11361137
#else
11371138
var dec = int.Parse(plainText.Substring(i, 3), NumberStyles.None, CultureInfo.InvariantCulture);
11381139
#endif
1139-
DecToBin(dec, 10, bitArray, ref index);
1140+
index = DecToBin(dec, 10, bitArray, index);
11401141
}
11411142
if (plainText.Length % 3 == 2)
11421143
{
@@ -1145,7 +1146,7 @@ private static BitArray PlainTextToBinaryNumeric(string plainText)
11451146
#else
11461147
var dec = int.Parse(plainText.Substring(plainText.Length / 3 * 3, 2), NumberStyles.None, CultureInfo.InvariantCulture);
11471148
#endif
1148-
DecToBin(dec, 7, bitArray, ref index);
1149+
index = DecToBin(dec, 7, bitArray, index);
11491150
}
11501151
else if (plainText.Length % 3 == 1)
11511152
{
@@ -1154,7 +1155,7 @@ private static BitArray PlainTextToBinaryNumeric(string plainText)
11541155
#else
11551156
var dec = int.Parse(plainText.Substring(plainText.Length / 3 * 3, 1), NumberStyles.None, CultureInfo.InvariantCulture);
11561157
#endif
1157-
DecToBin(dec, 4, bitArray, ref index);
1158+
index = DecToBin(dec, 4, bitArray, index);
11581159
}
11591160
return bitArray;
11601161
}
@@ -1168,13 +1169,13 @@ private static BitArray PlainTextToBinaryAlphanumeric(string plainText)
11681169
while (count >= 2)
11691170
{
11701171
var dec = alphanumEncDict[plainText[index++]] * 45 + alphanumEncDict[plainText[index++]];
1171-
DecToBin(dec, 11, codeText, ref codeIndex);
1172+
codeIndex = DecToBin(dec, 11, codeText, codeIndex);
11721173
count -= 2;
11731174

11741175
}
11751176
if (count > 0)
11761177
{
1177-
DecToBin(alphanumEncDict[plainText[index]], 6, codeText, ref codeIndex);
1178+
DecToBin(alphanumEncDict[plainText[index]], 6, codeText, codeIndex);
11781179
}
11791180
return codeText;
11801181
}

0 commit comments

Comments
 (0)