Adding support for reading 3 of 9 Extended barcodes (containing lowercase characters) with GdPicture9

Microsoft .NET

3 of 9 barcodes are just about everywhere, and are one of the easiest barcodes to work with being widely supported by many SDK's. 3 of 9 originally supported only a subset of the ASCII character set, and later was extended to support the full range of characters. Often you will find 3 of 9 barcodes in the form of a font style that you can use in word processors, web applications, and other types of software. They can be copy and pasted. They are easy to draw, and most importantly, they are very easy to understand. You can read more on Wikipedia about it, but lets talk more about how GdPicture SDK deals with it.

code39-sample

GdPicture does support drawing 3 of 9 barcodes with the extended character set using the Barcode1DWriterType.Barcode1DWriterCode39Extended enumeration with Barcode1DWrite, but I found that it lacked the ability to read them using Barcode1DReaderDoScan. If you look deeper into the enumerations available for these methods, oddly enough both Barcode1DWriterType.Barcode1DWriterCode39 and Barcode1DWriterType.Barcode1DWriterCode39Extended exist for drawing the barcode, but only Barcode1DReaderType.Barcode1DWriterCode39 exists for reading when using Barcode1DReaderDoScan.

gI_78908_LOGO-GD9

Now, let me clarify before we look at a solution. GdPicture does technically read the barcode with extended characters, but it doesn't actually return the extended ASCII characters. Instead, it returns each uppercase character prefixed with the + character, which is a token indicating the character casing, such as the sign in a signed integer. In the examples below we will look at the most common scenario which is support for lower case characters, which are only part of the extended character set.

string threeOfNine    = "ABC123"; // normal character set
string threeOfNineExt = "abc123"; // extended character set

These are the raw values you would normally expect to see when reading 3 of 9 barcodes using a proper SDK. In GdPicture however, let us take a look at the difference when reading the extended barcodes.

string threeOfNine    = "ABC123";    // normal character set
string threeOfNineExt = "+A+B+C123"; // extended character set

This pattern is very consistent, so we can write a simple function to parse and return the correct character casing.

/// <devdoc>
/// This method is for GdPicture9's lack of support for *reading* the 3 of 9 Extended character set,
/// which allows for lowercase characters. GdPicture will still return a barcode value, but each lower
/// case character is preceded by + character to indicate the casing difference.
/// 
/// ie. TEst (raw value of *TEst*) would be returned as TE+S+T (raw value of *TE+S+T*)
/// </devdoc>
private static string Get3Of9ExtendedBarcodeValue(string s)
{
    var newValue = string.Empty;

    for (int i = 0; i < s.Length; i++)
        if (s[i] == '+')
            newValue += s[++i].ToString(CultureInfo.InvariantCulture).ToLower();
        else
            newValue += s[i];

    return newValue.Replace("+", string.Empty);
}

The method is pretty straight forward, iterating over each character and identifying the token. When the token is found we do a forward lookup in the array, which will be the actual character value, and we know to return the lowercase value. We also increment the loop counter at the same time since we are processing that character. Otherwise if no token is found, we simply return the character as is.

Simple!

Now, I have only written this function to account for the casing differences between the character sets because that was the scenario I needed to solve for the project I was working on. I could have used other barcode libraries, but we already had licensing for GdPicture and it is significantly faster than most of the libraries out there, and I tested quite a few. I might revisit this blog at a later time and write a new one discussing the other extended characters, but for now we will leave it there.

Happy coding!

104 Comments

  1. Pingback: experienceleaguecommunities.adobe.com/t5/user/viewprofilepage/user-id/17881217

  2. Pingback: in.pinterest.com/vidalista80review/

  3. Pingback: dizain cheloveka

  4. Pingback: sulfatealbuterol.com

  5. Pingback: ivermectinus.com

  6. Pingback: human design

  7. Pingback: axbb.ru

  8. Pingback: cenforcemg.com

  9. Pingback: flagylzub.com

  10. Pingback: kmgra.com

  11. Pingback: lasixotc.com

  12. Pingback: stromectool.com

  13. Pingback: flagyltb.com

  14. Pingback: levitraoffer.net

  15. Pingback: priligy 30mg

  16. Pingback: tiktok

  17. Pingback: hyocimax s tablet uses

  18. Pingback: can i buy amoxicillin

  19. Pingback: nitrostat pill

  20. Pingback: ciprodex dosage

  21. Pingback: groups

  22. Pingback: cheapest viagra 50mg

  23. Pingback: amoxil for urinary tract infection

  24. Pingback: cialis online prices

  25. Pingback: purple viagra 100

  26. Pingback: prednisolone dose for asthma

  27. Pingback: blood pressure bystolic

  28. Pingback: amoxil capsule price

  29. Pingback: professorkorotkov.ru

  30. Pingback: viahelpmen.wordpress.com

  31. Pingback: psycholog-korotkov.ru

  32. Pingback: vermact plus

  33. Pingback: clomid for sale

  34. Pingback: psikhologvyalte.ru

  35. Pingback: clincitop gel buy online

  36. Pingback: besivance eye drop prices

  37. Pingback: buy assurans

  38. Pingback: here

  39. Pingback: caverta 25

  40. Pingback: super tadalista

  41. Pingback: kamagra uk

  42. Pingback: vidalista.pics

  43. Pingback: otclevitra.com

  44. Pingback: clomiphene Citrate

  45. Pingback: ekzistenczialnyj

  46. Pingback: Ïñèõîëîã, ïñèõîòåðàïåâò, ïñèõèàòð, ïñèõîàíàëèòèê

  47. Pingback: prednisone 20mg

  48. Pingback: clomid for sale

  49. Pingback: 75mg viagra

  50. Pingback: myprin92.ru

  51. Pingback: 0410.ru

  52. Pingback: atvip.ru

  53. Pingback: vigrakrs.com

  54. Pingback: why take latanoprost at night

  55. Pingback: sketchfab.com/female-cialis

  56. Pingback: 5yucMCMAAAAJ

  57. Pingback: instagram.com/korotkovlakanfreud

  58. Pingback: ofevinfo.wordpress.com

  59. Pingback: site

  60. Pingback: price of viagra per pill

  61. Pingback: samscainfo.wordpress.com

  62. Pingback: vidalforman.wordpress.com

  63. Pingback: Sochi-psiholog-Russia

  64. Pingback: who makes viagra pills

  65. Pingback: vardenafil 20mg

  66. Pingback: 100 mg viagra side effects

  67. Pingback: t.me/s/psy_chat_online

  68. Pingback: clomiphene 50mg ovulation

  69. Pingback: afinitor cost

  70. Pingback: Forum

  71. Pingback: fildena.homes

  72. Pingback: 439W6fo

  73. Pingback: psy

  74. Pingback: r2f.ru

  75. Pingback: xblx.ru

  76. Pingback: dilts.g-u.su

  77. Pingback: anatoliy-alekseyevich-derkach.ru

  78. Pingback: where to buy cheap toradol for sale

  79. Pingback: artane and coolock credit union

  80. Pingback: zanaflex for sciatica pain

  81. Pingback: cyproheptadine hydrochloride syrup ip side effects

  82. Pingback: street value of tizanidine 2mg

  83. Pingback: periactin sciroppo dosaggio

  84. Pingback: can you get generic ketorolac pills

  85. Pingback: baclofen compared to vicodin

  86. Pingback: azathioprine irregular heartbeat

  87. Pingback: maxalt wine

  88. Pingback: classe terapeutica piroxicam

  89. Pingback: how effective is meloxicam for pain

  90. Pingback: prospecto de lioresal

  91. Pingback: imdur pill

  92. Pingback: what are side effects of mobic

  93. Pingback: imuran proctitis

  94. Pingback: rizatriptan benzoate drug bank

  95. Pingback: can you take sumatriptan and paracetamol together

  96. Pingback: where can i buy generic pyridostigmine without dr prescription

  97. Pingback: diclofenac vs celebrex

  98. Pingback: cilostazol en insuficiencia cardiaca

  99. Pingback: can mebeverine be taken after food

  100. Pingback: indomethacin 75 sr

  101. Pingback: migraine injection imitrex

  102. Pingback: amitriptyline dose for sleep

  103. Pingback: mestinon tabs

  104. Pingback: elavil mgs

Leave a Comment