请不要问为什么,但是我必须将一个字符串(最多4个字符)存储在一个整数值(即4个字节)中。
首先,我写了这篇文章,并且有效:
String value = "AAA";
int sum = IntStream.range(0, value.length())
.limit(4)
.map(i -> value.charAt(i) << (i * 8))
.sum();
System.out.println(sum);
我无法想出可行的解决方案。
StringBuffer out = new StringBuffer();
while (sum > 0) {
int ch = sum & 0xff;
sum >>= 8;
out.append((char) ch);
}
有任何想法以实用的方式写回(“ AAA”)的方法吗?
答案 0 :(得分:3)
一种解决方案可能是:
StringBuilder out =
IntStream.iterate(sum, s -> s > 0, s -> s >> 8)
.mapToObj(s -> (char) (s & 0xff))
.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append);
System.out.println(out.toString());
注意:我使用了三个参数的IntStream.iterate
重载,该重载从Java 9开始可用。
答案 1 :(得分:3)
使用流将其转换回String
并不是最好的方法;您现有的while
循环看起来更干净,而且性能可能更高。但是,有一个流解决方案。
String result = IntStream.range(0, 4)
.map(i -> (value >>> 24 - (i * 8)) & 0xFF)
.dropWhile(i -> i == 0)
.mapToObj(v -> String.valueOf( (char) v))
.collect(Collectors.joining());
这将生成一些字节索引,获取特定的字节值,将其映射到char
,它们将它们重新连接回String
。它还使用Java 9+ method dropWhile
删除前导0值。
我已通过添加“ 24-”以首先抓住最高有效字节来纠正此问题,以产生正确的顺序。
如果value
为0x10101 * 65
,则返回"AAA"
。在value
中,0x10101 * 65 + 1
返回"AAB"
。
答案 2 :(得分:2)
它基本上是一个char [4],它先被转移到一个int然后再返回。实际上,我想这会起作用
public static String getStr(int encoded){
return ((char)(encoded >> 24) + ((char)((encoded >> 16) 0xFF)
+ ((char)((encoded >> 8) & 0xFF) + ((char)((encoded) & 0xFF)
}
答案 3 :(得分:1)
这与您的非常相似,但也许会有所帮助
String str = IntStream.iterate(sum, s -> s > 0, s -> s >> 8)
.mapToObj(s -> String.valueOf((char)(s & 0xff)))
.collect(Collectors.joining());
答案 4 :(得分:1)
感谢大家的贡献。我找到了另一种可与您分享的解决方案:
String str = IntStream.iterate(sum, s -> s >> 8)
.limit(4)
.filter(s -> s > 0)
.mapToObj(s -> String.valueOf((char) (s & 0xff)))
.collect(Collectors.joining());
答案 5 :(得分:1)
String str = IntStream.of(0, 8, 16, 24)
.mapToObj(i->(char)(sum>>i&0xff)+"")
.collect(Collectors.joining());