Why does the VB expression
Asc(ChrB(128) & ChrB(0))
yield 63 and not 128?
Recently, I’ve been looking at Visual Basic’s InputB function for reading binary data. According to the help system, these B-suffixed functions are for use with “byte data” in text files and strings.
In VB, a single character in a string occupies not one but two bytes. For instance, the function call Input(1, #fnum)
returns a two-byte string. In contrast, however, InputB(1, #fnum)
returns a one-byte string (or “half” a character).
Traditional ASCII / ANSI characters are contained within a single byte. If you used InputB(1, #fnum)
to read an ASCII / ANSI character into the first “half” of a string character and fill the second half with a “zero” byte using ChrB(0)
then it should stand to reason that the resulting two-byte character would be identical to the result obtained using the ordinary Input(1, #fnum)
instead.
In fact, that is largely what happens. It’s only when you hit certain character codes, such as 128, that things go awry.
Consider the following code, for example. To avoid all the file handling code, I’ve used AscB in place of InputB.
Dim c1 As Integer
Dim c2 As Integer
Dim i As Integer
Debug.Print "Code #1", "Code #2"
For i = 0 To 255
c1 = Asc(Chr(i))
c2 = Asc(ChrB(i) & ChrB(0))
Debug.Print c1, c2
Next i
The output is below.
All’s well until we reach 128. From there to 159, c1
and c2
are sometimes identical, as expected, but other times not. When they’re not, c1
is always 63. From 160 upwards, the output is again well behaved.
Code #1 Code #2
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
13 13
14 14
15 15
16 16
17 17
18 18
19 19
20 20
21 21
22 22
23 23
24 24
25 25
26 26
27 27
28 28
29 29
30 30
31 31
32 32
33 33
34 34
35 35
36 36
37 37
38 38
39 39
40 40
41 41
42 42
43 43
44 44
45 45
46 46
47 47
48 48
49 49
50 50
51 51
52 52
53 53
54 54
55 55
56 56
57 57
58 58
59 59
60 60
61 61
62 62
63 63
64 64
65 65
66 66
67 67
68 68
69 69
70 70
71 71
72 72
73 73
74 74
75 75
76 76
77 77
78 78
79 79
80 80
81 81
82 82
83 83
84 84
85 85
86 86
87 87
88 88
89 89
90 90
91 91
92 92
93 93
94 94
95 95
96 96
97 97
98 98
99 99
100 100
101 101
102 102
103 103
104 104
105 105
106 106
107 107
108 108
109 109
110 110
111 111
112 112
113 113
114 114
115 115
116 116
117 117
118 118
119 119
120 120
121 121
122 122
123 123
124 124
125 125
126 126
127 127
128 63
129 129
130 63
131 63
132 63
133 63
134 63
135 63
136 63
137 63
138 63
139 63
140 63
141 141
142 63
143 143
144 144
145 63
146 63
147 63
148 63
149 63
150 63
151 63
152 63
153 63
154 63
155 63
156 63
157 157
158 63
159 63
160 160
161 161
162 162
163 163
164 164
165 165
166 166
167 167
168 168
169 169
170 170
171 171
172 172
173 173
174 174
175 175
176 176
177 177
178 178
179 179
180 180
181 181
182 182
183 183
184 184
185 185
186 186
187 187
188 188
189 189
190 190
191 191
192 192
193 193
194 194
195 195
196 196
197 197
198 198
199 199
200 200
201 201
202 202
203 203
204 204
205 205
206 206
207 207
208 208
209 209
210 210
211 211
212 212
213 213
214 214
215 215
216 216
217 217
218 218
219 219
220 220
221 221
222 222
223 223
224 224
225 225
226 226
227 227
228 228
229 229
230 230
231 231
232 232
233 233
234 234
235 235
236 236
237 237
238 238
239 239
240 240
241 241
242 242
243 243
244 244
245 245
246 246
247 247
248 248
249 249
250 250
251 251
252 252
253 253
254 254
255 255
Ant is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
1