gpt4 book ai didi

java - Netty Decoder 在 Windows 和 Linux 中生成不同的输出

转载 作者:行者123 更新时间:2023-11-30 03:24:18 26 4
gpt4 key购买 nike

  public class TCPNetty {
static class Handler extends SimpleChannelUpstreamHandler {
private static final char[] hexCode = "0123456789ABCDEF".toCharArray();
public String printHexBinary(byte[] data) {
StringBuilder r = new StringBuilder(data.length * 2);
for (byte b: data) {
r.append(hexCode[(b >> 4) & 0xF]);
r.append(hexCode[(b & 0xF)]);
}
return r.toString();
}@
Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
String msg = (String) e.getMessage();
String mainstr = "";

mainstr = printHexBinary(msg.getBytes()).toUpperCase();
System.out.println("========================" + mainstr);
System.out.println("@@@@@@@@@@@@@@@@@@@@" + mainstr);
ctx.sendUpstream(e);
}@
Override@ SuppressWarnings({
"ThrowableResultOfMethodCallIgnored"
})
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
e.getChannel().close();
}
}
public static void main(String[] args) {
ServerBootstrap bootstrap = new ServerBootstrap(
new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() throws Exception {
final ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("decoder", new StringDecoder());
pipeline.addLast("encoder", new StringEncoder());
pipeline.addLast("handler", new Handler());
// pipeline.addLast("executor", executionHandler);
// pipeline.addLast("handler", new EchoCloseServerHandler());
return pipeline;
}
});
bootstrap.bind(new InetSocketAddress(5002));
}
}

问题是,当我收到十六进制字符串时,它在 Linux 和 Windows 中显示不同的输出

例如:在 Windows 中获取:2929B10007003F972D30BD0D在Linux中获取:2929EFBFBD000700EFBFBDEFBFBD2D30EFBFBD0D

我认为 netty 字符串解码器有问题,但不确定。

最佳答案

StringEncoderStringDecoder使用default Charset除非另有规定。 Linux 上的默认字符集(可能)是 UTF-8,而 Windows 上的默认字符集通常是 cp-1251。这意味着编码形式会有所不同,正如您所看到的。

要解决此问题,请将管道代码更改为:

pipeline.addLast("decoder", new StringDecoder(StandardCharsets.UTF_8));
pipeline.addLast("encoder", new StringEncoder(StandardCharsets.UTF_8));

mainstr = printHexBinary(msg.getBytes()).toUpperCase();

mainstr = printHexBinary(msg.getBytes(StandardCharsets.UTF_8)).toUpperCase();

StandardCharsets需要 Java 1.7。

任何其他可以表示所有输入的字符集也足够了,但 UTF-8 是典型的,因此您应该坚持使用它。

关于java - Netty Decoder 在 Windows 和 Linux 中生成不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30636626/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com