diff --git a/fxbarcode/oned/BC_OnedCodaBarWriter.cpp b/fxbarcode/oned/BC_OnedCodaBarWriter.cpp
index 3c3ea4a..42990f7 100644
--- a/fxbarcode/oned/BC_OnedCodaBarWriter.cpp
+++ b/fxbarcode/oned/BC_OnedCodaBarWriter.cpp
@@ -30,16 +30,21 @@
 
 namespace {
 
-const char kOnedCodaAlphabet[] = "0123456789-$:/.+ABCDTN";
+const char kOnedCodaAlphabet[] = {'0', '1', '2', '3', '4', '5', '6', '7',
+                                  '8', '9', '-', '$', ':', '/', '.', '+',
+                                  'A', 'B', 'C', 'D', 'T', 'N'};
 
-const int32_t kOnedCodaCharacterEncoding[22] = {
-    0x003, 0x006, 0x009, 0x060, 0x012, 0x042, 0x021, 0x024,
-    0x030, 0x048, 0x00c, 0x018, 0x045, 0x051, 0x054, 0x015,
-    0x01A, 0x029, 0x00B, 0x00E, 0x01A, 0x029};
+const int8_t kOnedCodaCharacterEncoding[] = {
+    0x03, 0x06, 0x09, 0x60, 0x12, 0x42, 0x21, 0x24, 0x30, 0x48, 0x0c,
+    0x18, 0x45, 0x51, 0x54, 0x15, 0x1A, 0x29, 0x0B, 0x0E, 0x1A, 0x29};
+static_assert(FX_ArraySize(kOnedCodaCharacterEncoding) == 22, "Wrong size");
+static_assert(FX_ArraySize(kOnedCodaCharacterEncoding) ==
+                  FX_ArraySize(kOnedCodaAlphabet),
+              "Wrong size");
 
-const char START_END_CHARS[] = {'A', 'B', 'C', 'D', 'T', 'N', '*', 'E',
-                                'a', 'b', 'c', 'd', 't', 'n', 'e'};
-const char CONTENT_CHARS[] = {'0', '1', '2', '3', '4', '5', '6', '7',
+const char kStartEndChars[] = {'A', 'B', 'C', 'D', 'T', 'N', '*', 'E',
+                               'a', 'b', 'c', 'd', 't', 'n', 'e'};
+const char kCOntentChars[] = {'0', '1', '2', '3', '4', '5', '6', '7',
                               '8', '9', '-', '$', '/', ':', '+', '.'};
 
 }  // namespace
@@ -50,7 +55,7 @@
 CBC_OnedCodaBarWriter::~CBC_OnedCodaBarWriter() {}
 
 bool CBC_OnedCodaBarWriter::SetStartChar(char start) {
-  if (!pdfium::ContainsValue(START_END_CHARS, start))
+  if (!pdfium::ContainsValue(kStartEndChars, start))
     return false;
 
   m_chStart = start;
@@ -58,7 +63,7 @@
 }
 
 bool CBC_OnedCodaBarWriter::SetEndChar(char end) {
-  if (!pdfium::ContainsValue(START_END_CHARS, end))
+  if (!pdfium::ContainsValue(kStartEndChars, end))
     return false;
 
   m_chEnd = end;
@@ -90,8 +95,8 @@
     return false;
 
   char narrow_ch = static_cast<char>(ch);
-  return pdfium::ContainsValue(CONTENT_CHARS, narrow_ch) ||
-         (isContent && pdfium::ContainsValue(START_END_CHARS, narrow_ch));
+  return pdfium::ContainsValue(kCOntentChars, narrow_ch) ||
+         (isContent && pdfium::ContainsValue(kStartEndChars, narrow_ch));
 }
 
 bool CBC_OnedCodaBarWriter::CheckContentValidity(
@@ -157,9 +162,8 @@
       default:
         break;
     }
-    int32_t code = 0;
-    size_t len = strlen(kOnedCodaAlphabet);
-    for (size_t i = 0; i < len; i++) {
+    int8_t code = 0;
+    for (size_t i = 0; i < FX_ArraySize(kOnedCodaAlphabet); i++) {
       if (ch == kOnedCodaAlphabet[i]) {
         code = kOnedCodaCharacterEncoding[i];
         break;
diff --git a/fxbarcode/oned/BC_OnedCode39Writer.cpp b/fxbarcode/oned/BC_OnedCode39Writer.cpp
index f26ebc1..f04dc19 100644
--- a/fxbarcode/oned/BC_OnedCode39Writer.cpp
+++ b/fxbarcode/oned/BC_OnedCode39Writer.cpp
@@ -30,18 +30,25 @@
 
 namespace {
 
-const char kOnedCode39Alphabet[] =
-    "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%";
+const char kOnedCode39Alphabet[] = {
+    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
+    'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+    'U', 'V', 'W', 'X', 'Y', 'Z', '-', '.', ' ', '*', '$', '/', '+', '%'};
+constexpr size_t kOnedCode39AlphabetLen = FX_ArraySize(kOnedCode39Alphabet);
 
-const char kOnedCode39Checksum[] =
-    "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%";
+const char kOnedCode39Checksum[] = {
+    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
+    'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+    'U', 'V', 'W', 'X', 'Y', 'Z', '-', '.', ' ', '$', '/', '+', '%'};
+static_assert(FX_ArraySize(kOnedCode39Checksum) == 43, "Wrong size");
 
-const int32_t kOnedCode39CharacterEncoding[44] = {
-    0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124,
-    0x064, 0x109, 0x049, 0x148, 0x019, 0x118, 0x058, 0x00D, 0x10C,
-    0x04C, 0x01C, 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007,
-    0x106, 0x046, 0x016, 0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0,
-    0x085, 0x184, 0x0C4, 0x094, 0x0A8, 0x0A2, 0x08A, 0x02A};
+const int16_t kOnedCode39CharacterEncoding[] = {
+    0x0034, 0x0121, 0x0061, 0x0160, 0x0031, 0x0130, 0x0070, 0x0025, 0x0124,
+    0x0064, 0x0109, 0x0049, 0x0148, 0x0019, 0x0118, 0x0058, 0x000D, 0x010C,
+    0x004C, 0x001C, 0x0103, 0x0043, 0x0142, 0x0013, 0x0112, 0x0052, 0x0007,
+    0x0106, 0x0046, 0x0016, 0x0181, 0x00C1, 0x01C0, 0x0091, 0x0190, 0x00D0,
+    0x0085, 0x0184, 0x00C4, 0x0094, 0x00A8, 0x00A2, 0x008A, 0x002A};
+static_assert(FX_ArraySize(kOnedCode39CharacterEncoding) == 44, "Wrong size");
 
 }  // namespace
 
@@ -132,7 +139,7 @@
                                           hints);
 }
 
-void CBC_OnedCode39Writer::ToIntArray(int32_t a, int8_t* toReturn) {
+void CBC_OnedCode39Writer::ToIntArray(int16_t a, int8_t* toReturn) {
   for (int32_t i = 0; i < 9; i++) {
     toReturn[i] = (a & (1 << i)) == 0 ? 1 : m_iWideNarrRatio;
   }
@@ -143,21 +150,19 @@
     return '*';
 
   int32_t checksum = 0;
-  size_t len = strlen(kOnedCode39Alphabet);
   for (const auto& c : contents) {
     size_t j = 0;
-    for (; j < len; j++) {
+    for (; j < kOnedCode39AlphabetLen; j++) {
       if (kOnedCode39Alphabet[j] == c) {
         if (c != '*')
           checksum += j;
         break;
       }
     }
-    if (j >= len)
+    if (j >= kOnedCode39AlphabetLen)
       return '*';
   }
-  checksum = checksum % 43;
-  return kOnedCode39Checksum[checksum];
+  return kOnedCode39Checksum[checksum % FX_ArraySize(kOnedCode39Checksum)];
 }
 
 uint8_t* CBC_OnedCode39Writer::EncodeImpl(const ByteString& contents,
@@ -175,9 +180,8 @@
   m_iContentLen = encodedContents.GetLength();
   int32_t codeWidth = (wideStrideNum * m_iWideNarrRatio + narrStrideNum) * 2 +
                       1 + m_iContentLen;
-  size_t len = strlen(kOnedCode39Alphabet);
   for (size_t j = 0; j < m_iContentLen; j++) {
-    for (size_t i = 0; i < len; i++) {
+    for (size_t i = 0; i < kOnedCode39AlphabetLen; i++) {
       if (kOnedCode39Alphabet[i] != encodedContents[j])
         continue;
 
@@ -200,7 +204,7 @@
     return nullptr;
 
   for (int32_t l = m_iContentLen - 1; l >= 0; l--) {
-    for (size_t i = 0; i < len; i++) {
+    for (size_t i = 0; i < kOnedCode39AlphabetLen; i++) {
       if (kOnedCode39Alphabet[i] != encodedContents[l])
         continue;
 
diff --git a/fxbarcode/oned/BC_OnedCode39Writer.h b/fxbarcode/oned/BC_OnedCode39Writer.h
index ffed6d9..90611c0 100644
--- a/fxbarcode/oned/BC_OnedCode39Writer.h
+++ b/fxbarcode/oned/BC_OnedCode39Writer.h
@@ -35,7 +35,7 @@
   bool encodedContents(const WideStringView& contents, WideString* result);
 
  private:
-  void ToIntArray(int32_t a, int8_t* toReturn);
+  void ToIntArray(int16_t a, int8_t* toReturn);
   char CalcCheckSum(const ByteString& contents);
 
   int8_t m_iWideNarrRatio;
