Skip to content

Commit 2aac276

Browse files
committed
update Java version
1 parent 823f98d commit 2aac276

File tree

3 files changed

+95
-33
lines changed

3 files changed

+95
-33
lines changed

src/main/java/com/upokecenter/cbor/Base64.java

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -67,42 +67,47 @@ private static void WriteBase64(
6767
String alphabet = classic ? Base64Classic : Base64URL;
6868
int length = offset + count;
6969
int i = offset;
70-
char[] buffer = new char[4];
70+
byte[] buffer = new byte[32];
71+
int bufferOffset = 0;
7172
for (i = offset; i < (length - 2); i += 3) {
72-
buffer[0] = (char)alphabet.charAt((data[i] >> 2) & 63);
73-
buffer[1] = (char)alphabet.charAt(((data[i] & 3) << 4) +
73+
if (bufferOffset >= buffer.length) {
74+
writer.WriteAscii(buffer, 0, bufferOffset);
75+
bufferOffset = 0;
76+
}
77+
buffer[bufferOffset++] = (byte)alphabet.charAt((data[i] >> 2) & 63);
78+
buffer[bufferOffset++] = (byte)alphabet.charAt(((data[i] & 3) << 4) +
7479
((data[i + 1] >> 4) & 15));
75-
buffer[2] = (char)alphabet.charAt(((data[i + 1] & 15) << 2) + ((data[i +
80+
buffer[bufferOffset++] = (byte)alphabet.charAt(((data[i + 1] & 15) << 2) +
81+
((data[i +
7682
2] >> 6) & 3));
77-
buffer[3] = (char)alphabet.charAt(data[i + 2] & 63);
78-
writer.WriteCodePoint((int)buffer[0]);
79-
writer.WriteCodePoint((int)buffer[1]);
80-
writer.WriteCodePoint((int)buffer[2]);
81-
writer.WriteCodePoint((int)buffer[3]);
83+
buffer[bufferOffset++] = (byte)alphabet.charAt(data[i + 2] & 63);
8284
}
8385
int lenmod3 = count % 3;
8486
if (lenmod3 != 0) {
87+
if (bufferOffset >= buffer.length) {
88+
writer.WriteAscii(buffer, 0, bufferOffset);
89+
bufferOffset = 0;
90+
}
8591
i = length - lenmod3;
86-
buffer[0] = (char)alphabet.charAt((data[i] >> 2) & 63);
92+
buffer[bufferOffset++] = (byte)alphabet.charAt((data[i] >> 2) & 63);
8793
if (lenmod3 == 2) {
88-
buffer[1] = (char)alphabet.charAt(((data[i] & 3) << 4) + ((data[i + 1] >>
94+
buffer[bufferOffset++] = (byte)alphabet.charAt(((data[i] & 3) << 4) +
95+
((data[i + 1] >>
8996
4) & 15));
90-
buffer[2] = (char)alphabet.charAt((data[i + 1] & 15) << 2);
91-
writer.WriteCodePoint((int)buffer[0]);
92-
writer.WriteCodePoint((int)buffer[1]);
93-
writer.WriteCodePoint((int)buffer[2]);
97+
buffer[bufferOffset++] = (byte)alphabet.charAt((data[i + 1] & 15) << 2);
9498
if (padding) {
95-
writer.WriteCodePoint((int)'=');
99+
buffer[bufferOffset++] = (byte)'=';
96100
}
97101
} else {
98-
buffer[1] = (char)alphabet.charAt((data[i] & 3) << 4);
99-
writer.WriteCodePoint((int)buffer[0]);
100-
writer.WriteCodePoint((int)buffer[1]);
102+
buffer[bufferOffset++] = (byte)alphabet.charAt((data[i] & 3) << 4);
101103
if (padding) {
102-
writer.WriteCodePoint((int)'=');
103-
writer.WriteCodePoint((int)'=');
104+
buffer[bufferOffset++] = (byte)'=';
105+
buffer[bufferOffset++] = (byte)'=';
104106
}
105107
}
106108
}
109+
if (bufferOffset >= 0) {
110+
writer.WriteAscii(buffer, 0, bufferOffset);
111+
}
107112
}
108113
}

src/main/java/com/upokecenter/cbor/StringOutput.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,49 @@ public void WriteString(String str, int index, int length) throws java.io.IOExce
6565
}
6666
}
6767

68+
public void WriteAscii(byte[] bytes, int index, int length) throws java.io.IOException {
69+
if (bytes == null) {
70+
throw new NullPointerException("bytes");
71+
}
72+
if (index < 0) {
73+
throw new IllegalArgumentException("\"index\" (" + index + ") is not" +
74+
"\u0020greater or equal to 0");
75+
}
76+
if (index > bytes.length) {
77+
throw new IllegalArgumentException("\"index\" (" + index + ") is not less" +
78+
"\u0020or equal to " + bytes.length);
79+
}
80+
if (length < 0) {
81+
throw new IllegalArgumentException(" (" + length + ") is not greater or" +
82+
"\u0020equal to 0");
83+
}
84+
if (length > bytes.length) {
85+
throw new IllegalArgumentException(" (" + length + ") is not less or equal" +
86+
"\u0020to " + bytes.length);
87+
}
88+
if (bytes.length - index < length) {
89+
throw new IllegalArgumentException("\"bytes\" + \"'s length minus \" +" +
90+
"\u0020index (" + (bytes.length - index) + ") is not greater or equal to " +
91+
length);
92+
}
93+
if (this.outputStream == null) {
94+
DataUtilities.ReadUtf8FromBytes(
95+
bytes,
96+
index,
97+
length,
98+
this.builder,
99+
false);
100+
} else {
101+
for (int i = 0; i < length; ++i) {
102+
byte b = bytes[i + index];
103+
if ((((int)b) & 0x7f) != b) {
104+
throw new IllegalArgumentException("str is non-ASCII");
105+
}
106+
}
107+
this.outputStream.write(bytes, index, length);
108+
}
109+
}
110+
68111
public void WriteCodePoint(int codePoint) throws java.io.IOException {
69112
if ((codePoint >> 7) == 0) {
70113
// Code point is in the Basic Latin range (U+0000 to U+007F)

src/test/java/com/upokecenter/test/CBORTest.java

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2035,7 +2035,7 @@ public void TestParseDecimalStrings() {
20352035
}
20362036
}
20372037

2038-
@Test(timeout = 50000)
2038+
@Test(timeout = 200000)
20392039
public void TestRandomData() {
20402040
RandomGenerator rand = new RandomGenerator();
20412041
CBORObject obj;
@@ -2341,18 +2341,9 @@ private static String ToByteArrayStringFrom(byte[] array, int pos) {
23412341
public void TestRandomNonsense() {
23422342
RandomGenerator rand = new RandomGenerator();
23432343
for (int i = 0; i < 1000; ++i) {
2344+
System.out.println(i + ": " + java.util.Date.UtcNow);
23442345
byte[] array = new byte[rand.UniformInt(1000000) + 1];
2345-
for (int j = 0; j < array.length; ++j) {
2346-
if (j + 3 <= array.length) {
2347-
int r = rand.UniformInt(0x1000000);
2348-
array[j] = (byte)(r & (byte)0xff);
2349-
array[j + 1] = (byte)((r >> 8) & (byte)0xff);
2350-
array[j + 2] = (byte)((r >> 16) & (byte)0xff);
2351-
j += 2;
2352-
} else {
2353-
array[j] = (byte)rand.UniformInt(256);
2354-
}
2355-
}
2346+
rand.GetBytes(array, 0, array.length);
23562347
TestRandomOne(array);
23572348
}
23582349
}
@@ -2386,10 +2377,18 @@ public static void TestRandomOne(byte[] array) {
23862377
while ((startingAvailable - inputStream.available()) != startingAvailable) {
23872378
try {
23882379
CBORObject o;
2380+
long oldPos=(startingAvailable - inputStream.available());
23892381
o = CBORObject.Read(inputStream);
2382+
long cborlen=(startingAvailable - inputStream.available())-oldPos;
2383+
if (cborlen>3000) {
2384+
System.out.println("pos={0} of {1}",(startingAvailable - inputStream.available()),startingAvailable);
2385+
}
23902386
byte[] encodedBytes = (o == null) ? null : o.EncodeToBytes();
23912387
try {
23922388
CBORObject.DecodeFromBytes(encodedBytes);
2389+
if (cborlen>3000) {
2390+
System.out.println("end DecodeFromBytes");
2391+
}
23932392
} catch (Exception ex) {
23942393
throw new IllegalStateException(ex.getMessage(), ex);
23952394
}
@@ -2400,14 +2399,29 @@ public static void TestRandomOne(byte[] array) {
24002399
}
24012400
if (o != null) {
24022401
try {
2402+
if (cborlen>3000) {
2403+
System.out.println("toJSONString " + java.util.Date.UtcNow);
2404+
}
24032405
jsonString = o.ToJSONString();
2406+
if (cborlen>3000) {
2407+
System.out.println("jsonStringLen = " + jsonString.length());
2408+
}
24042409
} catch (CBORException ex) {
24052410
System.out.println(ex.getMessage());
24062411
jsonString = "";
24072412
}
24082413
if (jsonString.length() > 0) {
2414+
if (cborlen>3000) {
2415+
System.out.println("fromJSONString " + java.util.Date.UtcNow);
2416+
}
24092417
CBORObject.FromJSONString(jsonString);
2418+
if (cborlen>3000) {
2419+
System.out.println("writeToJSON " + java.util.Date.UtcNow);
2420+
}
24102421
TestWriteToJSON(o);
2422+
if (cborlen>3000) {
2423+
System.out.println("endJSON " + java.util.Date.UtcNow);
2424+
}
24112425
}
24122426
}
24132427
} catch (Exception ex) {

0 commit comments

Comments
 (0)