UdonLibrary
1.0.0
機械システム研究部 C++ ライブラリ
Toggle main menu visibility
読み取り中…
検索中…
一致する文字列を見つけられません
HexStringParser.hpp
[詳解]
1
//
2
// 16進数文字列パーサー
3
//
4
// Copyright (c) 2022 udonrobo
5
//
6
7
#pragma once
8
9
#include <
Udon/Types/ArrayView.hpp
>
10
11
namespace
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
91
inline
bool
ByteStringToHexString
(
92
Udon::ArrayView<const uint8_t>
byteString,
93
Udon::ArrayView<char>
destHexString)
noexcept
94
{
95
96
if
(destHexString.size() <
ConvertedByteStringSize
(byteString.size()))
97
{
98
return
false
;
99
}
100
101
auto
it = destHexString.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
117
inline
bool
HexStringToByteString
(
118
Udon::ArrayView<const char>
hexString,
119
Udon::ArrayView<uint8_t>
destByteString)
noexcept
120
{
121
if
(hexString.size() % 2)
122
{
123
return
false
;
124
}
125
126
if
(destByteString.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
destByteString[i / 2] = high << 4 | low;
144
}
145
146
return
true
;
147
}
148
149
}
// namespace Udon
ArrayView.hpp
Udon::ArrayView
配列参照クラス
Definition
ArrayView.hpp:27
Udon
Definition
Bit.hpp:12
Udon::ByteValueToHexChar
char ByteValueToHexChar(uint8_t byte) noexcept
バイト値を16進数文字に変換する
Definition
HexStringParser.hpp:45
Udon::HexCharToByteValue
uint8_t HexCharToByteValue(char hex) noexcept
16進数文字をバイト値に変換する
Definition
HexStringParser.hpp:16
Udon::ByteStringToHexString
bool ByteStringToHexString(Udon::ArrayView< const uint8_t > byteString, Udon::ArrayView< char > destHexString) noexcept
バイト列を16進数文字列に変換する
Definition
HexStringParser.hpp:91
Udon::HexStringToByteString
bool HexStringToByteString(Udon::ArrayView< const char > hexString, Udon::ArrayView< uint8_t > destByteString) noexcept
16進数文字列をバイト列に変換する
Definition
HexStringParser.hpp:117
Udon::ConvertedByteStringSize
size_t ConvertedByteStringSize(size_t byteStringSize) noexcept
バイト列を16進数文字列に変換した際の、16進数文字列のサイズを取得する
Definition
HexStringParser.hpp:72
Udon::ConvertedHexStringSize
size_t ConvertedHexStringSize(size_t hexStringSize) noexcept
16進数文字列をバイト列に変換した際の、バイト列のサイズを取得する
Definition
HexStringParser.hpp:80