gpt4 book ai didi

ssl - 从 NSInputStream 转换字节有问题吗?

转载 作者:太空宇宙 更新时间:2023-11-03 13:17:19 25 4
gpt4 key购买 nike

我有 openssl 服务器和 Objective-C 客户端。我这样发消息

uint32_t testD = 161;
err = SSL_write(ssl_, &testD, sizeof(uint32_t));

然后通过 NSInputStream 读取它

case NSStreamEventHasBytesAvailable:
{
uint8_t buffer[4];
int len;
while ([inStream hasBytesAvailable])
{
len = [inStream read:buffer maxLength:sizeof(buffer)];
if (len > 0)
{
NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
NSData *theData = [[NSData alloc] initWithBytes:buffer length:len];
if (nil != output)
{
char buff;
[theData getBytes:&buff length:1];
uint32_t temp = (uint32_t)buffer;
}
...

因此,在输出中我有“¡”,它是第 161 个 ASCII 符号,在 buff 中我有 '\xa1' 并且在 temp 中是非常大的数字,但实际上我需要 161 在 temp 中。

我读到 '\xa1' 也是 161,但我不能将其转换为 uint32_t。有什么问题?


回答:

问题出在类型转换上。这对我来说很好:

unsigned char buff;
int temp = buff;

char buff;
int b = (unsigned char) buff;

最佳答案

SSL_write() 没有使用任何编码,\xa1 == 161 是一个数学恒等式,不是任何编码过程的结果。当您成功恢复 \xa1, 时,NSInputStream 显然也没有使用解码。

在我看来,您正在转换缓冲区的地址而不是其内容,这就是为什么您会获得随编译而变化的高值。

此外,您可能会通过读取可用的任何内容然后只消耗其中的四个字节来过度运行数据:实际上更少,因为您错误地测试了 len >= 1 而不是 len >= 4.

你应该:

  1. 使用恰好四个字节的缓冲区。无需动态分配它:您可以将其声明为本地数组。
  2. 一直读到读完四个字节。这需要一个循环。
  3. 更改转换语法(不要问我怎么做,我不是 Objective-C 专家,但恢复 buff 的代码看起来是一个好的开始),这样你就可以得到内容缓冲区而不是地址。

之后您可能会遇到字节序问题。

与编码无关。

关于ssl - 从 NSInputStream 转换字节有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28788537/

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