【问题标题】:How to initialiaze a unsigned byte array with a set of well known values in Java 7?如何在 Java 7 中使用一组众所周知的值初始化无符号字节数组?
【发布时间】:2013-12-31 15:54:08
【问题描述】:

我想用 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++;
}

这会产生:

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?为什么我在7F 之后不能得到80, 81 ...

编辑: 这是我解决问题的方法

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++;
}

输出

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 直流 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

【问题讨论】:

  • 你为什么要检查字符?为什么不直接使用字节?

标签: java arrays initialization byte


【解决方案1】:

为什么会有一堆 3F ?为什么 7F 后我不能得到 80、81……?

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

来自documentation

此方法总是用此字符集的默认替换字符串替换格式错误的输入和不可映射的字符序列。

您似乎并不真的希望以文本数据开头,因此我建议您完全避免使用它。直接填充字节数组即可:

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

请注意,Java 并没有真正的 无符号字节 - 上面的索引 128-255 会以负​​值结束...但它们会有正确的 位 em>设置。您可以通过用 0xff 屏蔽它们来将它们视为无符号值:

int x = table[200] & 0xff; // Now x is 200

【讨论】:

  • 现在工作正常!谢谢:)
【解决方案2】:

最接近的编码是ISO-8859-1,看来你根本不想编码。

您可以一次复制一个字符

char[] tmp = new char[256];

for(char c = 0; c < tmp.length; c++)
    tmp[c] = c;

byte[] table = new byte[tmp.length];
for(int i = 0; i < tmp.length; i++) {
    table[i] = (byte) tmp[i];

    System.out.format("%02X ",  table[i] & 0xff);
    if(i % 16 == 15) {
        System.out.println();
    }
}

打印

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 

【讨论】:

  • 我会犹豫是否建议为此使用任何字符编码,因为在我看来,OP 并不真的首先需要字符......他们'只是将它们用作达到目的的手段。
  • 这个答案很有趣,因为它通过使用更合适的Charset 解决了我的问题。
  • @Alex:不是真的——这不是一个“更合适的”Charset,因为你不是天生就在处理文本。这是一个Charsethappens 将 U+0000-U+00FF 分别映射到字节 0x00-0xff……但它仍然不是(IMO)填充字节数组的好方法。远离文本、字符集、字符串等,除非你真的想代表 text
【解决方案3】:
    int N = 256;

    byte[] table = new byte[N];
    for(int b = 1; b<N; b++){
        table[b] = (byte) b;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 2013-11-25
    • 2013-04-29
    • 2021-11-29
    相关资源
    最近更新 更多