【问题标题】:How do encode a string as 8-bit ASCII characters? [closed]如何将字符串编码为 8 位 ASCII 字符? [关闭]
【发布时间】:2015-11-18 21:19:25
【问题描述】:

我正在尝试连接到另一个开发人员创建的服务器。他不再可用,所以我试图解释他的意思。

我正在创建要发送到服务器的 UDP 消息,并且在消息的必填字段之一的描述中,他有这个:

客户端的名称,使用 8 位 ASCII 字符编码

例如,如果我想使用名称“MyName”,结果将是 (char, dec, hex):

| M |  77 | 0x4D |
| y | 121 | 0x79 |
| N |  78 | 0x4E |
| a |  97 | 0x61 |
| m | 109 | 0x6D |
| e | 101 | 0x65 |

我只是对这个领域应该有什么感到有点困惑。应该是

0771217897109101

应该是这样

0x4D0x790x4E0x610x6D0x65

或者应该是完全不同的东西?

作为一个仅供参考,他使用 C++ 编写服务器,而我使用 Java。我知道这没有什么区别,我只是想我会添加一些信息。

【问题讨论】:

  • byte[] b = { 0x4D, 0x79, 0x4E...};byte[]b = { 077, 0121, 078...}。陷阱:Java 字符是 16 位 Unicode 编码的,而 C++ 字符通常是 8 位。
  • 协议说明在哪里?描述本身没有意义;如果客户的名字是“äïëöü”,其中没有一个字符可以用 ASCII 编码怎么办?
  • 我投票决定将此问题作为离题结束,因为这涉及我们无权访问的第 3 方代码,因此无法评论
  • @Brian 忽略 SO 的精英。你的问题很好,需要不止一个压迫者来结束你的问题。请记住,来自 Sun Java 开发人员论坛的推动人们需要去某个地方以他们卓越的智慧推动人们。
  • @ControlAltDel 为什么?他的问题很明确,他有一个协议规范,想知道如何在 Java 中管理它。为什么需要服务器代码?

标签: java c++ ascii


【解决方案1】:

你可以在 Java 中做到这一点:

String name = ...; // "MyName", etc
byte[] arr = name.getBytes(StandardCharsets.US_ASCII);
// append arr to UDP message as needed...

没有 8bit ASCII 这样的东西。 ASCII 只有 7bit。有效 ASCII 范围 (0-127) 之外的字符值将转换为 ? (hex 0x3F)。 128-255 范围内的字符通常称为 ANSI 或扩展 ASCII。这些是特定于语言环境的字符。如果服务器实际上需要 8bit 字符,那么它不需要 ASCII,而是需要 ANSI,这会在使用非 ASCII 字符时导致语言冲突。大多数现代服务器通常需要 UTF-8,其中允许 8 位字符数据。您将不得不参考该服务器的文档或源代码来确定它的实际期望。听起来它实际上可能期望 7 位 ASCII 字符简单地扩展到 8 位字节(因此不允许字符 > 127)。

【讨论】:

  • 可能加上"\r\n"(CR+LF 换行符)或"\u0000"(C 字符串终止符)。
  • @JoopEggen:该声明不适用于本次讨论或我的回答。问题是关于将 ASCII 字符串放入 UDP 消息中。 UDP 消息如何界定其字段取决于正在实现的特定 UDP 协议。
  • 需要注意的是,这个方法只会创建一个CharsetEncoder,它将替换潜在的不可映射的字符(见CodingErrorAction
  • @fge:这可以追溯到我关于“有效 ASCII 范围 (0-127) 之外的字符值将转换为 ? (hex 0x3F)。" OP 的规范提到了 ASCII。这是在 Java 中将String 转换为 ASCII 的方法。如果有问题的服务器可以支持其他 8 位字符集,则只需相应地更改 getBytes() 的参数值即可。
  • @RemyLebeau “这可以追溯到我关于“有效 ASCII 范围之外的字符值”的声明 和误导。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 2016-02-25
  • 1970-01-01
相关资源
最近更新 更多