我在计算字符串长度时遇到问题。我有以下字符串:
30 ctime=1460687405.982514823\n
由以下定义形成:
扩展标题应包含一个或多个记录,每个记录的构造如下:
"%d%s =%s \ n",长度,关键字,值
扩展报头记录应根据ISO / IEC10646-1:2000标准(UTF-8)进行编码。所显示的length
字段,空白,等号和新行应限于以UTF-8编码的可移植字符集。 keyword
和value
字段可以是任何UTF-8字符。 length
字段应为八位字节中扩展标头记录的十进制长度,包括尾随换行符。
问题是length
字段。
如何计算尺寸?求和字节值?整个String.length()?
什么是八位字节?
答案 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位数字,如果不是这样,则重试。
这意味着,如果关键字和值为test
和X
,则结果将为10 test=X\n
,即使9 test=X\n
看起来更合适。
如果关键字和值为A
和B
,则结果将为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