@@ -321,22 +321,25 @@ QRCodeData PlaceModules()
321
321
{
322
322
var qr = new QRCodeData ( version , true ) ;
323
323
var size = qr . ModuleMatrix . Count - 8 ;
324
- var blockedModules = new ModulePlacer . BlockedModules ( size ) ;
325
- ModulePlacer . PlaceFinderPatterns ( qr , blockedModules ) ;
326
- ModulePlacer . ReserveSeperatorAreas ( size , blockedModules ) ;
327
- ModulePlacer . PlaceAlignmentPatterns ( qr , alignmentPatternTable [ version ] . PatternPositions , blockedModules ) ;
328
- ModulePlacer . PlaceTimingPatterns ( qr , blockedModules ) ;
329
- ModulePlacer . PlaceDarkModule ( qr , version , blockedModules ) ;
330
- ModulePlacer . ReserveVersionAreas ( size , version , blockedModules ) ;
331
- ModulePlacer . PlaceDataWords ( qr , interleavedData , blockedModules ) ;
332
- var maskVersion = ModulePlacer . MaskCode ( qr , version , blockedModules , eccLevel ) ;
333
- var formatStr = GetFormatString ( eccLevel , maskVersion ) ;
334
-
335
- ModulePlacer . PlaceFormat ( qr , formatStr , true ) ;
324
+ var tempBitArray = new BitArray ( 18 ) ; //version string requires 18 bits
325
+ using ( var blockedModules = new ModulePlacer . BlockedModules ( size ) )
326
+ {
327
+ ModulePlacer . PlaceFinderPatterns ( qr , blockedModules ) ;
328
+ ModulePlacer . ReserveSeperatorAreas ( size , blockedModules ) ;
329
+ ModulePlacer . PlaceAlignmentPatterns ( qr , alignmentPatternTable [ version ] . PatternPositions , blockedModules ) ;
330
+ ModulePlacer . PlaceTimingPatterns ( qr , blockedModules ) ;
331
+ ModulePlacer . PlaceDarkModule ( qr , version , blockedModules ) ;
332
+ ModulePlacer . ReserveVersionAreas ( size , version , blockedModules ) ;
333
+ ModulePlacer . PlaceDataWords ( qr , interleavedData , blockedModules ) ;
334
+ var maskVersion = ModulePlacer . MaskCode ( qr , version , blockedModules , eccLevel ) ;
335
+ GetFormatString ( tempBitArray , eccLevel , maskVersion ) ;
336
+ ModulePlacer . PlaceFormat ( qr , tempBitArray , true ) ;
337
+ }
338
+
336
339
if ( version >= 7 )
337
340
{
338
- var versionString = GetVersionString ( version ) ;
339
- ModulePlacer . PlaceVersion ( qr , versionString , true ) ;
341
+ GetVersionString ( tempBitArray , version ) ;
342
+ ModulePlacer . PlaceVersion ( qr , tempBitArray , true ) ;
340
343
}
341
344
342
345
return qr ;
@@ -349,12 +352,14 @@ QRCodeData PlaceModules()
349
352
/// Generates a BitArray containing the format string for a QR code based on the error correction level and mask pattern version.
350
353
/// The format string includes the error correction level, mask pattern version, and error correction coding.
351
354
/// </summary>
355
+ /// <param name="bitArray">The <see cref="BitArray"/> to write to, or null to create a new one.</param>
352
356
/// <param name="level">The error correction level to be encoded in the format string.</param>
353
357
/// <param name="maskVersion">The mask pattern version to be encoded in the format string.</param>
354
358
/// <returns>A BitArray containing the 15-bit format string used in QR code generation.</returns>
355
- private static BitArray GetFormatString ( ECCLevel level , int maskVersion )
359
+ private static void GetFormatString ( BitArray fStrEcc , ECCLevel level , int maskVersion )
356
360
{
357
- var fStrEcc = new BitArray ( 15 ) ; // Total length including space for mask version and padding
361
+ fStrEcc . Length = 15 ;
362
+ fStrEcc . SetAll ( false ) ;
358
363
WriteEccLevelAndVersion ( ) ;
359
364
360
365
// Apply the format generator polynomial to add error correction to the format string.
@@ -378,7 +383,6 @@ private static BitArray GetFormatString(ECCLevel level, int maskVersion)
378
383
379
384
// XOR the format string with a predefined mask to add robustness against errors.
380
385
fStrEcc . Xor ( _getFormatMask ) ;
381
- return fStrEcc ;
382
386
383
387
void WriteEccLevelAndVersion ( )
384
388
{
@@ -445,11 +449,13 @@ private static void ShiftAwayFromBit0(BitArray fStrEcc, int num)
445
449
/// Encodes the version information of a QR code into a BitArray using error correction coding similar to format information encoding.
446
450
/// This method is used for QR codes version 7 and above.
447
451
/// </summary>
452
+ /// <param name="vStr">A <see cref="BitArray"/> to write the version string to.</param>
448
453
/// <param name="version">The version number of the QR code (7-40).</param>
449
454
/// <returns>A BitArray containing the encoded version information, which includes error correction bits.</returns>
450
- private static BitArray GetVersionString ( int version )
455
+ private static void GetVersionString ( BitArray vStr , int version )
451
456
{
452
- var vStr = new BitArray ( 18 ) ;
457
+ vStr . Length = 18 ;
458
+ vStr . SetAll ( false ) ;
453
459
DecToBin ( version , 6 , vStr , 0 ) ; // Convert the version number to a 6-bit binary representation.
454
460
455
461
var count = vStr . Length ;
@@ -471,8 +477,6 @@ private static BitArray GetVersionString(int version)
471
477
vStr . Length = 12 + 6 ;
472
478
ShiftAwayFromBit0 ( vStr , ( 12 - count ) + 6 ) ;
473
479
DecToBin ( version , 6 , vStr , 0 ) ;
474
-
475
- return vStr ;
476
480
}
477
481
478
482
/// <summary>
0 commit comments