UdonLibrary 1.0.0
機械システム研究部 C++ ライブラリ
読み取り中…
検索中…
一致する文字列を見つけられません
HexStringParser.hpp
[詳解]
1//
2// 16進数文字列パーサー
3//
4// Copyright (c) 2022-2024 udonrobo
5//
6
7#pragma once
8
10
11namespace Udon
12{
16 inline uint8_t HexCharToByteValue(char hex) noexcept
17 {
18 // clang-format off
19 switch (hex)
20 {
21 case '0': return 0x0;
22 case '1': return 0x1;
23 case '2': return 0x2;
24 case '3': return 0x3;
25 case '4': return 0x4;
26 case '5': return 0x5;
27 case '6': return 0x6;
28 case '7': return 0x7;
29 case '8': return 0x8;
30 case '9': return 0x9;
31 case 'A': case 'a': return 0xa;
32 case 'B': case 'b': return 0xb;
33 case 'C': case 'c': return 0xc;
34 case 'D': case 'd': return 0xd;
35 case 'E': case 'e': return 0xe;
36 case 'F': case 'f': return 0xf;
37 default : return 0xff;
38 }
39 // clang-format on
40 }
41
45 inline char ByteValueToHexChar(uint8_t byte) noexcept
46 {
47 switch (byte)
48 {
49 case 0x0: return '0';
50 case 0x1: return '1';
51 case 0x2: return '2';
52 case 0x3: return '3';
53 case 0x4: return '4';
54 case 0x5: return '5';
55 case 0x6: return '6';
56 case 0x7: return '7';
57 case 0x8: return '8';
58 case 0x9: return '9';
59 case 0xa: return 'a';
60 case 0xb: return 'b';
61 case 0xc: return 'c';
62 case 0xd: return 'd';
63 case 0xe: return 'e';
64 case 0xf: return 'f';
65 default: return ' ';
66 }
67 }
68
72 inline size_t ConvertedByteStringSize(size_t byteStringSize) noexcept
73 {
74 return byteStringSize * 2;
75 }
76
80 inline size_t ConvertedHexStringSize(size_t hexStringSize) noexcept
81 {
82 return hexStringSize / 2;
83 }
84
93 Udon::ArrayView<char> distHexString) noexcept
94 {
95
96 if (distHexString.size() < ConvertedByteStringSize(byteString.size()))
97 {
98 return false;
99 }
100
101 auto it = distHexString.begin();
102 for (const auto& byte : byteString)
103 {
104 *it++ = ByteValueToHexChar(byte >> 4 & 0xf);
105 *it++ = ByteValueToHexChar(byte >> 0 & 0xf);
106 }
107
108 return true;
109 }
110
119 Udon::ArrayView<uint8_t> distByteString) noexcept
120 {
121 if (hexString.size() % 2)
122 {
123 return false;
124 }
125
126 if (distByteString.size() < ConvertedHexStringSize(hexString.size()))
127 {
128 return false;
129 }
130
131 for (const auto& hex : hexString)
132 {
133 if (isxdigit(hex) == 0)
134 {
135 return false;
136 }
137 }
138
139 for (size_t i = 0; i < hexString.size(); i += 2)
140 {
141 const uint8_t high = HexCharToByteValue(hexString[i + 0]);
142 const uint8_t low = HexCharToByteValue(hexString[i + 1]);
143 distByteString[i / 2] = high << 4 | low;
144 }
145
146 return true;
147 }
148
149} // namespace Udon
配列参照クラス
Definition ArrayView.hpp:27
Definition Bit.hpp:12
char ByteValueToHexChar(uint8_t byte) noexcept
バイト値を16進数文字に変換する
Definition HexStringParser.hpp:45
uint8_t HexCharToByteValue(char hex) noexcept
16進数文字をバイト値に変換する
Definition HexStringParser.hpp:16
bool HexStringToByteString(Udon::ArrayView< const char > hexString, Udon::ArrayView< uint8_t > distByteString) noexcept
16進数文字列をバイト列に変換する
Definition HexStringParser.hpp:117
bool ByteStringToHexString(Udon::ArrayView< const uint8_t > byteString, Udon::ArrayView< char > distHexString) noexcept
バイト列を16進数文字列に変換する
Definition HexStringParser.hpp:91
size_t ConvertedByteStringSize(size_t byteStringSize) noexcept
バイト列を16進数文字列に変換した際の、16進数文字列のサイズを取得する
Definition HexStringParser.hpp:72
size_t ConvertedHexStringSize(size_t hexStringSize) noexcept
16進数文字列をバイト列に変換した際の、バイト列のサイズを取得する
Definition HexStringParser.hpp:80