计算"八位字节"

时间:2016-04-29 23:28:48

标签: java

我在计算字符串长度时遇到问题。我有以下字符串:

30 ctime=1460687405.982514823\n

由以下定义形成:

扩展标题应包含一个或多个记录,每个记录的构造如下:

"%d%s =%s \ n",长度,关键字,值

扩展报头记录应根据ISO / IEC10646-1:2000标准(UTF-8)进行编码。所显示的length字段,空白,等号和新行应限于以UTF-8编码的可移植字符集。 keywordvalue字段可以是任何UTF-8字符。 length字段应为八位字节中扩展标头记录的十进制长度,包括尾随换行符。

问题是length字段。

如何计算尺寸?求和字节值?整个String.length()?

什么是八位字节?

2 个答案:

答案 0 :(得分:1)

octet是一个8位字节。

Java中的String是一组16位字符。当您将这些16位[unicode]字符编码为UTF-8编码字节时, 字符串(当时可能是byte[])的大小就是被问到的对于。有关将Java字符串编码为UTF-8的更多详细信息,请参阅this question

答案 1 :(得分:1)

八位字节表示字节,这意味着您首先必须将标题文本转换为UTF-8编码的字节,并计算字节数。

您可以通过调用getBytes(Charset charset),指定UTF_8字符集来执行此操作。

当然,问题是整个标题的长度取决于指定长度所需的位数。以下代码将假定标题长度为2位数字,如果不是这样,则重试。

这意味着,如果关键字和值为testX,则结果将为10 test=X\n,即使9 test=X\n看起来更合适。
如果关键字和值为AB,则结果将为6 A=B\n,因为它应该是,并且长度将根据需要增长到3,4,5,......数字

private static byte[] buildExtendedHeader(String keyword, String value) {
    byte[] bytes = (' ' + keyword + '=' + value + '\n').getBytes(StandardCharsets.UTF_8);
    int len = bytes.length + 2; // let's assume 2-digit length
    for (;;) {
        byte[] lenBytes = Integer.toString(len).getBytes(StandardCharsets.US_ASCII);
        int realLen = lenBytes.length + bytes.length;
        if (len == realLen) {
            byte[] header = new byte[len];
            System.arraycopy(lenBytes, 0, header, 0, lenBytes.length);
            System.arraycopy(bytes, 0, header, lenBytes.length, bytes.length);
            return header;
        }
        len = realLen;
    }
}

<强> TEST

byte[] header = buildExtendedHeader("LIKE A STAMPEDE", "À LA DÉBANDADE");
System.out.printf("%s%n%d octets:", new String(header, StandardCharsets.UTF_8).replace("\n", "\\n"), header.length);
for (byte b : header)
    System.out.printf(" %02x", b);

<强>输出

36 LIKE A STAMPEDE=À LA DÉBANDADE\n
36 octets: 33 36 20 4c 49 4b 45 20 41 20 53 54 41 4d 50 45 44 45 3d c3 80 20 4c 41 20 44 c3 89 42 41 4e 44 41 44 45 0a