如何使用Java 7中的一组众所周知的值初始化无符号字节数组?

Ste*_*han 1 java arrays byte initialization

我想初始化一个字节数组,其无符号字节值范围从0到255.

我是这样做的:

int N = 256;
char[] tmp = new char[N];

for (char c = 0; c < N; c++) {
    tmp[c] = c;
}

byte[] table = new byte[N];
table = Charset.forName("US-ASCII").encode(CharBuffer.wrap(tmp)).array();

int i=1;
for(byte b : table) {
    System.out.format("%02X ",  b);
    if(i%10==0) {
        System.out.println();
    }
    i++;
}
Run Code Online (Sandbox Code Playgroud)

这会产生:

00 01 02 03 04 05 06 07 08 09 
0A 0B 0C 0D 0E 0F 10 11 12 13 
14 15 16 17 18 19 1A 1B 1C 1D 
1E 1F 20 21 22 23 24 25 26 27 
28 29 2A 2B 2C 2D 2E 2F 30 31 
32 33 34 35 36 37 38 39 3A 3B 
3C 3D 3E 3F 40 41 42 43 44 45 
46 47 48 49 4A 4B 4C 4D 4E 4F 
50 51 52 53 54 55 56 57 58 59 
5A 5B 5C 5D 5E 5F 60 61 62 63 
64 65 66 67 68 69 6A 6B 6C 6D 
6E 6F 70 71 72 73 74 75 76 77 
78 79 7A 7B 7C 7D 7E 7F 3F 3F 
3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 
3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 
3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 
3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 
3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 
3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 
3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 
3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 
3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 
3F 3F 3F 3F 3F 3F 3F 3F 3F 3F

为什么会有一堆3F?为什么我不能80, 81 ...追求7F

编辑: 这是我如何解决我的问题

int N = 256;
byte[] table = new byte[N];

for (int i = 0; i < N; i++) {
    table[i] = (byte) i;
}

int i=1;
for(byte b : table) {
    System.out.format("%02X ",  b);
    if(i%10==0) {
        System.out.println();
    }
    i++;
}
Run Code Online (Sandbox Code Playgroud)

输出

00 01 02 03 04 05 06 07 08 09 
0A 0B 0C 0D 0E 0F 10 11 12 13 
14 15 16 17 18 19 1A 1B 1C 1D 
1E 1F 20 21 22 23 24 25 26 27 
28 29 2A 2B 2C 2D 2E 2F 30 31 
32 33 34 35 36 37 38 39 3A 3B 
3C 3D 3E 3F 40 41 42 43 44 45 
46 47 48 49 4A 4B 4C 4D 4E 4F 
50 51 52 53 54 55 56 57 58 59 
5A 5B 5C 5D 5E 5F 60 61 62 63 
64 65 66 67 68 69 6A 6B 6C 6D 
6E 6F 70 71 72 73 74 75 76 77 
78 79 7A 7B 7C 7D 7E 7F 80 81 
82 83 84 85 86 87 88 89 8A 8B 
8C 8D 8E 8F 90 91 92 93 94 95 
96 97 98 99 9A 9B 9C 9D 9E 9F 
A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 
AA AB AC AD AE AF B0 B1 B2 B3 
B4 B5 B6 B7 B8 B9 BA BB BC BD 
BE BF C0 C1 C2 C3 C4 C5 C6 C7 
C8 C9 CA CB CC CD CE CF D0 D1 
D2 D3 D4 D5 D6 D7 D8 D9 DA DB 
DC DD DE DF E0 E1 E2 E3 E4 E5 
E6 E7 E8 E9 EA EB EC ED EE EF 
F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 
FA FB FC FD FE FF

Jon*_*eet 7

为什么会有一堆3F?为什么我不能在7F之后获得80,81 ...

因为您的字符数组包含非ASCII字符.Charset.encode将它们编码为3F(ASCII表示'?')以表示它们不是ASCII格式.

文档:

此方法始终使用此charset的默认替换字符串替换格式错误的输入和不可映射的字符序列.

它看起来像你不真的想要的文本数据开始的,所以我建议你避免它彻底.只需直接填充字节数组:

byte[] table = new byte[N];
for (int i = 0; i < N; i++) {
    table[i] = (byte) i;
}
Run Code Online (Sandbox Code Playgroud)

请注意,Java实际上没有无符号字节 - 上面将以索引128-255的负值结束...但它们将设置正确的.您可以通过使用0xff屏蔽它们将它们视为无符号值:

int x = table[200] & 0xff; // Now x is 200
Run Code Online (Sandbox Code Playgroud)